gpt4 book ai didi

android - 监控图书馆中的位置设置

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:53 26 4
gpt4 key购买 nike

我正在开发一个可用于监控 Android 设备上的地理围栏的库。我注意到在设备设置中关闭并重新打开定位服务后,我在 Google Play 定位服务 GeofencingApi 类中注册的地理围栏丢失了。

我看过folks建议我需要在我的 AndroidManifest.xml 文件中注册 android.location.PROVIDERS_CHANGED 广播接收器。我已经做到了——但是这个广播接收器只有在我在我的测试应用程序中添加和删除测试提供者时才会被调用。在设备设置中切换位置服务时,我根本没有收到它。

我做错了什么吗?有谁知道如何可靠地确定用户何时在设备设置中切换定位服务?我希望能够在后台看到这些事件——即使我的应用程序没有运行。

我想我可以设置一个在后台运行的重复任务,并定期检查定位服务是否已切换,但这听起来很粗鲁且效率低下。

如果有帮助,我正在运行 Android 4.4.2 的 Moto G 上进行测试。到目前为止,我对地理围栏所做的一切都运行良好。

编辑:经过更多研究后,我发现 PROVIDERS_CHANGED 广播的行为因手机版本和型号而异。我运行 Android 5.1 的 Nexus 5 似乎实际上工作正常 - 我能够非常定期地接收 PROVIDERS_CHANGED 广播。我还有一部运行 4.4.x 的 Moto G 和 Moto X 手机,它们从未为我制作过 PROVIDERS_CHANGED 广播。 Android 4.2 上的 Samsung Galaxy S3 会为我生成广播,但在我将 Map Activity 与测试位置提供程序一起使用后就停止了。

无论如何,我决定暂时停止追究这个问题。我认为 Android 只是有问题。

最佳答案

如果您做错了什么,如果不看您的代码很难判断,但我只是使用来自 here 的代码运行并测试了一个简单的示例。作为指南,并对其进行调整以在库中包含 BroadcastReceiver。

需要注意的一件事:使用该库的应用需要在其 AndroidManifest.xml 中包含 receiver。参见 herehere ,都包含来自@CommonsWare 的信息。

在这里添加引用以防链接变坏:

Is there any way for a library project to independently register for a receiver in it's own manifest file?

目前没有。

因此,任何使用您的库的应用都需要在其 AndroidManifest.xml 中添加receiver

请注意,这是在三星 S4 上的 Android 4.4.4 上测试的。

我在编译为 aar 的库项目中使用 BroadcastReceiver 实现了此功能。

使用链接到库中的 BroadcastReceiver 的主应用程序的 AndroidManifest.xml 中设置的 receiver 元素,我能够在任何时候接收事件对位置设置进行了更改:

  • 开启位置开关
  • 关闭位置开关
  • 将定位模式更改为高精度
  • 将定位模式更改为省电
  • 将定位模式更改为仅 GPS

每次在位置设置中进行更改时,库中的 BroadcastReceiver 都会被触发,即使应用程序未运行也是如此。

我使用了一个简单的测试,每次更改位置设置时,库中的 BroadcastReceiver 都会显示一条 Toast 消息。

这里是库项目中的 LocationProviderChangedReceiver.java:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;

public class LocationProviderChangedReceiver extends BroadcastReceiver {
private final static String TAG = "LocationProviderChanged";

boolean isGpsEnabled;
boolean isNetworkEnabled;

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().matches("android.location.PROVIDERS_CHANGED"))
{
Log.i(TAG, "Location Providers changed");

LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

Toast.makeText(context, "GPS Enabled: " + isGpsEnabled + " Network Location Enabled: " + isNetworkEnabled, Toast.LENGTH_LONG).show();
}
}

}

然后,在主应用程序中,我将编译后的 myLibrary.aar 放在 libs 文件夹中,并设置 build.gradle 来编译 aar:

 repositories{
flatDir{
dirs 'libs'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.android.support:appcompat-v7:22.1.1"
compile "com.google.android.gms:play-services:7.3.0"

compile 'com.mylibrary.daniel:mylibrary:1.0@aar'

}

在主应用的 AndroidManifest.xml 中设置receiver:

    <receiver
android:name="com.mylibrary.daniel.mylibrary.LocationProviderChangedReceiver"
android:exported="false" >
<intent-filter>
<action android:name="android.location.PROVIDERS_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

然后,安装应用程序,并以几种不同的方式修改位置设置。每次都会触发库中的BroadcastReceiver:

enter image description here

enter image description here

enter image description here

enter image description here

关于android - 监控图书馆中的位置设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30467850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com