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

Posted

技术标签:

【中文标题】android - 谷歌地图未在某些设备上显示【英文标题】:android - google map is not showing on some devices 【发布时间】:2018-03-23 22:26:31 【问题描述】:

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

这是我的代码:

    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_
    android:layout_
    android:orientation="vertical">

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

</FrameLayout>

你能帮帮我吗?我的代码有什么问题?

【问题讨论】:

哪个设备不工作? api 和 google play 服务版本。这个权限也被授予 READ_GSERVICES 吗? 【参考方案1】:

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

如果 Google+、GoogleMaps、Google Duo 等其他 Google 应用更新,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();
    

【讨论】:

以上是关于android - 谷歌地图未在某些设备上显示的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图可以在模拟器上工作,但不能在 React 本机 APP 的 android 设备上工作

谷歌地图标记未在 Chrome 中显示

谷歌地图未在 vue.js 中显示

Android Google Map API 自定义标记在自定义标记上带来谷歌地图数据

如何将谷歌地图添加到android

离子应用谷歌地图显示 - 移动设备位置问题