android - 谷歌地图未在某些设备上展示

时间:2017-10-12 05:14:09

标签: android google-maps android-mapview android-maps-v2

我已经在很多手机上测试了我的应用,它工作正常并正确显示地图,但它并没有在某些设备上显示。非常奇怪的是,没有显示地图的设备在使用地图的其他应用程序中运行良好。我的意思是,该设备显示地图并在其他应用程序/

中正常工作

这是我的代码:

    public class Maps extends AppCompatActivity {
    MapFragment googleMap;
    GoogleMap Map;
    Intent locatorService = null;
    Double lat = 0.0, lon = 0.0;
    Typeface typeface;
    int isAvailable = 777;
    private LatLng location;
    Boolean forEdit = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maps);

        isAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        typeface = Func.getTypeFace(this);

        final Bundle bl = getIntent().getExtras();
        if (bl != null) {
            forEdit = true;
        }

        if (isAvailable == 0) {
            googleMap = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
            googleMap.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap googleMap) {
                    Map = googleMap;

                    if (googleMap == null) {
                        Toast.makeText(getApplicationContext(),
                                "نقشه روی گوشی شما قابل نمایش نیست", Toast.LENGTH_SHORT)
                                .show();
                    }

                }
            });
        }
        mapBuilder();
    }

    private void mapBuilder() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                && checkSelfPermission(
                android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && checkSelfPermission(
                android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(Maps.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        } else {
            doGPS();
        }


    }

    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mapBuilder();
                } else {
                    MyToast.makeText(Maps.this, "دسترسی به جی پی اس غیرفعال است");
                }
                return;
            }
        }
    }

    public boolean stopService() {
        if (this.locatorService != null) {
            this.locatorService = null;
        }
        return true;
    }

    public boolean startService() {
        try {
            FetchCordinates fetchCordinates = new FetchCordinates();
            fetchCordinates.execute();
            return true;
        } catch (Exception error) {
            return false;
        }
    }

    public AlertDialog CreateAlert(String title, String message) {
        AlertDialog alert = new AlertDialog.Builder(this).create();

        alert.setTitle(title);

        alert.setMessage(message);

        return alert;

    }

    public class FetchCordinates extends AsyncTask<String, Integer, String> {
        AlertDialog.Builder a;
        AlertDialog dialog;

        public double lati = 0.0;
        public double longi = 0.0;

        public LocationManager mLocationManager;
        public VeggsterLocationListener mVeggsterLocationListener;

        @Override
        protected void onPreExecute() {
            mVeggsterLocationListener = new VeggsterLocationListener();
            mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            mLocationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, 0, 0,
                    mVeggsterLocationListener);
        }

        @Override
        protected void onCancelled() {
            System.out.println("Cancelled by user!");
            dialog.dismiss();
            mLocationManager.removeUpdates(mVeggsterLocationListener);
        }

        @Override
        protected void onPostExecute(String result) {
            try {
                if (dialog != null)
                    dialog.dismiss();
            } catch (Exception e) {
                e.printStackTrace();
            }
            lat = lati;
            lon = longi;

            location = new LatLng(lat, lon);
            Map.addMarker(new MarkerOptions().position(location).title("مکان فعلی"));
            CameraUpdate update = CameraUpdateFactory.newLatLng(location);
            update = CameraUpdateFactory.newLatLngZoom(location, 15);  //zooom
            Map.animateCamera(update);
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            while (this.lati == 0.0) {

            }
            return null;
        }

        public class VeggsterLocationListener implements LocationListener {

            @Override
            public void onLocationChanged(Location location) {

                int lat = (int) location.getLatitude(); // * 1E6);
                int log = (int) location.getLongitude(); // * 1E6);
                int acc = (int) (location.getAccuracy());

                String info = location.getProvider();
                try {

                    // LocatorService.myLatitude=location.getLatitude();

                    // LocatorService.myLongitude=location.getLongitude();

                    lati = location.getLatitude();
                    longi = location.getLongitude();

                } catch (Exception e) {
                    // progDailog.dismiss();
                    // Toast.makeText(getApplicationContext(),"Unable to get Location"
                    // , Toast.LENGTH_LONG).show();
                }

            }

            @Override
            public void onProviderDisabled(String provider) {
                Log.i("OnProviderDisabled", "OnProviderDisabled");
            }

            @Override
            public void onProviderEnabled(String provider) {
                Log.i("onProviderEnabled", "onProviderEnabled");
            }

            @Override
            public void onStatusChanged(String provider, int status,
                                        Bundle extras) {
                Log.i("onStatusChanged", "onStatusChanged");

            }

        }

    }

    private void doGPS() {
        LocationManager mlocManager = null;
        LocationListener mlocListener;
        mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mlocListener = new MyLocationListener();
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
        if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER) && forEdit == false) {
            startService();
        } else {
            android.support.v7.app.AlertDialog.Builder a = new android.support.v7.app.AlertDialog.Builder(Maps.this);
            a.setMessage(("جی پی اس خاموش است. آیا میخواهید روشن کنید؟"));
            a.setPositiveButton(("بله"), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
                    boolean enabled = service
                            .isProviderEnabled(LocationManager.GPS_PROVIDER);
                    if (!enabled) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        startActivity(intent);
                    }
                }
            });
            a.setNegativeButton(("خیر"), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

            android.support.v7.app.AlertDialog dialog = a.show();
            TextView messageText = (TextView) dialog.findViewById(android.R.id.message);
            messageText.setGravity(Gravity.RIGHT);
            messageText.setTypeface(typeface);
        }

    }

    @Override
    protected void onStart() {
        super.onStart();
        if (Map != null && isAvailable != 777)
            mapBuilder();
    }

    @Override
    protected void onStop() {
        super.onStop();
        stopService();
    }

}

这是xml布局:

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>
你可以帮帮我吗?我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

检查isGooglePlayServicesAvailable的响应,很有可能获得“SERVICE_VERSION_UPDATE_REQUIRED”。在这种情况下,用户必须更新Google Play服务。

如果其他Google应用如Google+,GoogleMaps,Google Duo等获得更新,Google Play服务将自动更新。

switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity())) {
        case ConnectionResult.SUCCESS:
            googleMap = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
            googleMap.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                map = googleMap;
              }
            });
            break;
        case ConnectionResult.SERVICE_MISSING:
            Toast.makeText(getActivity(), "Google Play Services Missing", Toast.LENGTH_SHORT).show();
            break;
        case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:
            //The user has to update play services
            Toast.makeText(getActivity(), "Update Google Play Services", Toast.LENGTH_SHORT).show();
            break;
        default:
            Toast.makeText(getActivity(), GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()), Toast.LENGTH_SHORT).show();
    }