我的应用程序的一个用户报告说,即使他已经打开了网络定位,应用程序仍然显示网络定位关闭。他给我发了一些截图,这让我开始思考;
LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
他的手机(运行Android 4.1.2)出现了问题。一开始我认为这个是导致问题的原因,但事实并非如此。他还向我发送了该设置的截图。
后来我在谷歌上搜索,并找到了这个。这个问题似乎有助于我,但不幸的是答案对于这种情况没有帮助,提问者也没有继续追究。
我的应用程序与位置有关,并且一直使用LocationManager.isProviderEnabled来了解GPS和网络位置是否打开或关闭。直到最近,我从未被告知我的应用程序无法正确识别这些设置。他是第一个报告此问题的用户。我了解到还有另一种方法可以了解GPS和网络位置设置,即通过查看Secure.LOCATION_PROVIDERS_ALLOWED。为了看看这种方法在他的手机上如何工作,我编写了简单的应用程序,并要求他运行。该应用程序执行简单任务并在屏幕上显示文本。
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
{
string = "GPS=on\n";
}
else
{
string = "GPS=off\n";
}
if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
{
string += "Network=on\n";
}
else
{
string += "Network=off\n";
}
String status = android.provider.Settings.Secure.getString(getContentResolver(), Secure.LOCATION_PROVIDERS_ALLOWED);
if(status.contains("gps"))
{
string += "GPS=on\n";
}
else
{
string += "GPS=off\n";
}
if(status.contains("network"))
{
string += "Network=on\n";
}
else
{
string += "Network=off\n";
}
他又发送了截屏。看起来如下:
GPS=on
Network=off
GPS=on
Network=on
这个结果让我很不开心。可能有一些原因导致这样的结果。
- 就像其他人之前问过的,这个问题在一些手机上一直存在。
- 谷歌在4.1.2版本中出现了问题。isProviderEnabled在此版本中无法工作。
- 虽然没有文档说明,但是从4.1.2版本开始,isProviderEnabled的工作方式已经发生变化。
- 不,谷歌没有改变任何东西。这是这个特定手机上的一个错误。
现在我的问题是:
- LocationManager.isProviderEnabled对Android 4.1.2及更高版本仍然有效吗?
- 当我放弃使用LocationManager.isProviderEnabled时,查看Secure.LOCATION_PROVIDERS_ALLOWED是否有一些缺点/陷阱?
提前感谢。
编辑1:
您可以在Google Play上下载测试应用程序(链接)以尝试或请别人尝试。
编辑6:
我删除了测试应用程序,因为问题已得到解答。
编辑2:
我发布了一个应用程序,通过查看Secure.LOCATION_PROVIDERS_ALLOWED检查网络提供商是否可用,并在有限的手机上遇到了异常。以下是ACRA的报告。
一些运行4.1.1操作系统的手机。
java.lang.IllegalArgumentException: requested provider network doesn't exisit
at android.os.Parcel.readException(Parcel.java:1434)
at android.os.Parcel.readException(Parcel.java:1384)
at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:675)
at android.location.LocationManager._requestLocationUpdates(LocationManager.java:686)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:508)
一些装有4.1.2操作系统的手机。
java.lang.IllegalArgumentException: provider=network
at android.os.Parcel.readException(Parcel.java:1439)
at android.os.Parcel.readException(Parcel.java:1389)
at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:659)
at android.location.LocationManager._requestLocationUpdates(LocationManager.java:690)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:512)
我之前从未见过这些异常情况,直到我更改方法来检查网络提供商是否可用。所以我认为LocationManager.isProviderEnabled是安全的,而Secure.LOCATION_PROVIDERS_ALLOWED则是有风险的。但这会让我回到最初的问题。为什么LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)返回false(实际上没有),而Secure.LOCATION_PROVIDERS_ALLOWED告诉我们有。Android操作系统设计得不好吗?还是我只看到与特定手机(但至少有两个)相关的问题?
编辑3: 我更新了测试应用程序,通过使用requestLocationUpdates()访问GPS/网络位置提供程序的可用性,并披露了2台手机的名称。
1)SBM200SH,OS4.1.2,Softbank移动,夏普公司 2)HTX21(INFOBAR A02),OS4.1.1,KDDI,HTC
编辑4: 我找到了第三台手机。
3)SBM203SH,OS4.1.2,Softbank移动,夏普公司
编辑5: 夏普公司正在为移动开发人员运行讨论空间。我在那里发布了这个SO的问题,并希望夏普公司的某个人会采取行动。我会保持更新。