Android LocationManager 的 getBestProvider 返回 null
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10687409/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
LocationManager's getBestProvider returning null
提问by tyczj
I have a bunch of people reporting an error that I cannot reproduce. When trying to open a MapView
it's reporting that the getBestProvider
is returning null and I know that means that that no provider is found that fulfills my criteria which is ACCURACY_COARSE
so if there is no GPS then it should fall back on either network or passive
but it obviously doesn't on those user devices. What would that even mean then that GPS is off and there is no network connection?
我有很多人报告了我无法重现的错误。当尝试打开MapView
它时,它报告getBestProvider
返回 null,我知道这意味着没有找到满足我的标准的提供商,ACCURACY_COARSE
因此如果没有 GPS,那么它应该回退,network or passive
但显然不是那些用户设备。如果 GPS 关闭且没有网络连接,这甚至意味着什么?
I tried turning GPS off and putting the phone into airplane mode to try to reproduce the problem but still I was able to open the mapview without a force close so I don't know how to handle this problem.
我尝试关闭 GPS 并将手机置于飞行模式以尝试重现该问题,但我仍然能够在不强制关闭的情况下打开地图视图,因此我不知道如何处理此问题。
locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
geocoder = new Geocoder(this);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
List<String> lProviders = locationManager.getProviders(false);
for(int i=0; i<lProviders.size(); i++){
Log.d("LocationActivity", lProviders.get(i));
}
String provider = locationManager.getBestProvider(criteria, true); // null
long minTime = 60000;
float minDistance = 5;
locationManager.requestLocationUpdates(provider, minTime, minDistance, this);
error
错误
java.lang.RuntimeException: Unable to start activity ComponentInfo{ecm2.android/ecm2.android.LocationActivity}:
java.lang.IllegalArgumentException: provider==null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access00(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: provider==null
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:625)
at ecm2.android.LocationActivity.onCreate(LocationActivity.java:142)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
采纳答案by David Wasser
In your call to getBestProvider()
you've asked for enabled providers only(that's the second parameter in the method call which you have set to true
). If the user has disabled all providers, you will get null
.
在您对getBestProvider()
您的调用中,您只要求启用提供程序(这是您设置为 的方法调用中的第二个参数true
)。如果用户已禁用所有提供程序,您将获得null
.
In any case, you need to be able to deal with the situation where there are no available providers, so you'll need to check for null
and tell the user that he has not enabled any location.
在任何情况下,您都需要能够处理没有可用提供程序的情况,因此您需要检查null
并告诉用户他没有启用任何位置。
回答by Dekel Dahan
androidManifest.xml
androidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
MapsActivity.java
地图活动.java
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (permissions.length == 1 &&
permissions[0] == android.Manifest.permission.ACCESS_FINE_LOCATION &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
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) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
mMap.setMyLocationEnabled(true);
} else {
// Permission was denied. Display an error message.
}
}
MapsActivity.java/onCreate()
MapsActivity.java/onCreate()
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
} else {
ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
this work for me;
这对我有用;