我的应用程序的一位用户报告说,即使他确实打开了它,应用程序也会告诉网络位置已关闭。他给我发了几个屏幕截图,它们让我思考;
LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
无法正常工作。他的手机运行的是 Android 4.1.2,首先我认为这是导致此问题的原因。但事实并非如此。他也给我发了一张该设置的屏幕截图。
然后我用谷歌搜索并找到了这个。这个问题似乎对我有帮助,但不幸的是,答案对这种情况没有帮助,提问者没有进一步追问。
我的应用程序与位置有关,并且一直在使用 LocationManager.isProviderEnabled 来了解 GPS 和网络的位置是打开还是关闭。直到最近,我才被告知我的应用程序没有正确了解这些设置。他是第一个报告此问题的用户。通过查看 Secure.LOCATION_PROVIDERS_ALLOWED,我了解到还有另一种方法可以了解 GPS 和网络的位置设置。为了看看这个方法在他的手机上是如何工作的,我写了一个简单的应用程序并让他运行。这个应用程序执行简单的任务并在屏幕上显示文本。
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 及更高版本仍然有效吗?
- 看到 Secure.LOCATION_PROVIDERS_ALLOWED 是否有一些缺点/坑洞(当我放弃使用 LocationManager.isProviderEnabled 时?
提前致谢。
编辑1:
在这里,您可以从 Google Play 下载测试应用程序以尝试或请他人尝试。
编辑6:
自从回答了这个问题后,我删除了测试应用程序。
编辑2:
我发布了我的应用程序,该应用程序通过查看 Secure.LOCATION_PROVIDERS_ALLOWED 来检查网络提供商是否可用,并在有限的手机上出现异常。这些是 ACRA 的报告。
一些运行 OS 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)
一些运行 OS 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 是有风险的。但这会让我回到原来的问题。为什么当 Secure.LOCATION_PROVIDERS_ALLOWED 告诉存在时 LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) 返回 false(实际上并没有)。Android 操作系统是否设计不佳?或者我刚刚看到仅与特定(但至少有 2 个)手机相关的问题?
编辑3:
我更新了测试应用程序,通过 requestLocationUpdates() 访问显示 GPS/网络位置提供程序似乎真的可用或不可用。
我透露了 2 部手机的名称。
1) SBM200SH, OS4.1.2, Softbank mobile, Sharp Corporation
2) HTX21 (INFOBAR A02), OS4.1.1, KDDI, HTC
编辑4:
我找到了第三部手机。
3)SBM203SH,OS4.1.2,软银手机,夏普公司
编辑5:
夏普公司正在为移动开发者提供讨论空间。我通过提出这个 SO 的问题来发布主题。我希望夏普公司有人为此采取行动。我会保持更新。