Android:在Play商店发布后无法获取当前位置
问题描述:
我使用此代码获取当前位置并且工作正常。但在商店发布后,它不再适用。应用程序保持锁定在doInBackground函数中。Android:在Play商店发布后无法获取当前位置
private class GpsAsync extends AsyncTask<Void, Integer, Boolean> {
private ContactLocationListener contactLocationListener;
private Location location;
@Override
protected void onPreExecute() {
super.onPreExecute();
contactLocationListener = new ContactLocationListener();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, contactLocationListener);
}
@Override
protected Boolean doInBackground(Void... voids) {
while (location == null) {}
return null;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
textViewLatitude.setText(String.valueOf(location.getLatitude()));
textViewLongitude.setText(String.valueOf(location.getLongitude()));
}
public class ContactLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
location = loc;
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {}
@Override
public void onProviderEnabled(String s) {}
@Override
public void onProviderDisabled(String s) {}
}
}
我的清单:
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 50);
} else {
// start GpsAsync
}
答
两件事情:
-
在doInBackground while循环导致每次无限循环
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-feature android:name="android.hardware.location.gps" />
我的权限检查当LocationProvider失败时提供位置。它通常很危险。更好地使一些“卫士”绕 - 至少简单的计数器:
protected Boolean doInBackground(Void... voids) { Integer count = 0 while (location == null||count<10000) {count++} return null; }
-
至于为什么提供商位置发布后返回null问题。有几种可能的原因,请检查:
可用并接通设备上的全球定位系统(我猜它可能在不同的设备上进行测试后发布,其中GPS被关断)
?可能的权限问题。由于API 23对于位置和其他“危险”服务,除了在声明中声明之外,应该由用户接受一次(第一次调用应用程序时弹出)。如果用户“拒绝”服务 - GPS提供商将始终返回空值。
-
此外,考虑的情况下使用 “getBestProvider” 如果GPS不可用,如下面
LocationManager locationManager; String svcName = Context.LOCATION_SERVICE; locationManager = (LocationManager)getSystemService(svcName); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setSpeedRequired(false); criteria.setCostAllowed(true); String provider = locationManager.getBestProvider(criteria, true); locationManager.getLastKnownLocation(provider); l = locationManager.getLastKnownLocation(provider);
代码从用户请求许可:
// first check the permission in manifest:
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// then ask for GPS permission from user:
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
///////////////////////////////////////////////////////////////////////////////
///// NOTE: Even if we declared the permission in manifest, user can decline.
/// So we anyway will do try/catch on pemission exception later on!
///////////////////////////////////////////////////////////////////////////////
谢谢为你的答案。 - GPS已打开(我可以在Google地图上获取位置) - 在调用GpsAsync之前检查权限 - 对于应用程序,我们需要一个精确的位置,然后我们使用GPS提供商 –
再次,从API 23中检查代码中的权限是不够的。用户必须明确同意或拒绝使用某种服务即位置)。 我会在这样的弹出窗口的答案示例中更新。 – Cadet
我要求用户许可!查看我的请求中的更新以了解如何。 –