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 设备上工作