其他分享
首页 > 其他分享> > android – LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)不可靠,为什么?

android – LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)不可靠,为什么?

作者:互联网

我的应用程序的一个用户报告说应用程序告诉网络位置已关闭,即使他确实打开了它.他给我发了几张屏幕截图,他们让我思考;

LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

工作不正常.他的手机运行Android 4.1.2,首先我认为this是这个问题的原因.但事实并非如此.他也给我发了一个屏幕截图.

然后我用Google搜索并找到了this.这个问题似乎对我有所帮助,但不幸的是,回答对这个案例没有帮助,而且提问者没有进一步追求.

我的应用程序与位置有关,并且一直使用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将无法像之前那样工作.
>不,谷歌改变了一切.这是这款手机的错误.

现在我的问题是;

>对于Android 4.1.2及更高版本,LocationManager.isProviderEnabled是否仍然有效?
>看到Secure.LOCATION_PROVIDERS_ALLOWED是否有一些缺点/坑洞(当我放弃使用LocationManager.isProviderEnabled?

提前致谢.

EDIT1:

Here您可以从Google Play下载测试应用以尝试或要求某人尝试.

EDIT6:

我已经删除了测试应用程序,因为这个问

EDIT2:

我发布了我的应用程序,通过查看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告诉IS时,LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)返回false(并且确实没有). Android OS设计不佳吗?或者我刚刚看到的问题只与特定(但至少有2部)手机有关?

EDIT3:

我通过requestLocationUpdates()访问更新了测试应用程序以显示GPS /网络位置提供程序似乎真的可用.

我透露了2个电话名称.

1)SBM200SH,OS4.1.2,Softbank mobile,Sharp Corporation
2)HTX21(INFOBAR A02),OS4.1.1,KDDI,HTC

EDIT4:

我找到了第3部电话.

3)SBM203SH,OS4.1.2,Softbank mobile,Sharp Corporation

EDIT5:

夏普公司正在为移动开发者提供讨论空间.我通过提出这个SO的问题发布了主题.我希望夏普公司有人为此采取行动.我会保持这个更新.

解决方法:

Sharp公司提供的开发人员支持非常好,他们在不到48小时内回答了我的问题.

这是我从他们那里得到的.

LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)返回true,必须满足2个条件.

>某些内部状态已准备好进行网络定位.
>在设置屏幕上启用网络位置.

第二个是显而易见的.但首先不是.他们告诉我们如何模拟第一个是否定的.您可以通过以下步骤确认问题并运行我的测试应用程序(请参阅我的问题以获取下载链接).

>打开手机的设置.
>点按应用程序.
>点按全部标签.
>找到“网络位置”,点按它.
>点按“停用”.
>重新启动手机.
>运行测试应用.

因为我无法理解用户的电话未能执行与上面显示的第一个条件相关的事情并且显示问题.

结论:

LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)是可靠的.请注意,Secure.LOCATION_PROVIDERS_ALLOWED不太可靠.

标签:android,locationmanager
来源: https://codeday.me/bug/20190927/1824017.html