我使用此代码获取当前位置,它工作正常。但在商店发布后,它就再也无法使用了。应用程序保持锁定在doInBackground函数中。
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) {}
}
}
我的清单:
<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" />
我的许可检查:
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
}
答案 0 :(得分:0)
两件事:
每当LocationProvider无法提供位置时,doInBackground中的while循环会导致无限循环。它一般很危险。最好做一些&#34;警卫&#34;周围 - 至少是简单的柜台:
protected Boolean doInBackground(Void... voids) {
Integer count = 0
while (location == null||count<10000) {count++}
return null;
}
关于为什么提供程序在发布后为位置返回null的问题。有几个可能的原因,请检查:
GPS是否可用并在设备上开启?(我想它可能会在发布后在不同的设备上进行测试,其中GPS已关闭)
可能的权限问题。自API 23以来,对于位置和其他&#34;危险&#34;服务,除了在清单中声明之外,它应该被用户接受一次(第一次调用应用程序时弹出)。如果用户&#34;拒绝&#34;服务 - GPS提供商将始终返回null。
另外,请考虑使用&#34; getBestProvider&#34;如果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!
///////////////////////////////////////////////////////////////////////////////