Rob*_*ski 9 android android-geofence
我正在开发一个可用于监控Android设备上的地理围栏的库.我注意到,我在设备设置中关闭并重新启用了位置服务后,我在Google Play位置服务GeofencingApi类中注册的地理围栏会丢失.
我见过人们建议我需要android.location.PROVIDERS_CHANGED在我的AndroidManifest.xml文件中注册广播接收器.我已经这样做了 - 但是当我在测试应用程序中添加和删除测试提供程序时,只会调用此广播接收器.在设备设置中切换位置服务时,我根本不接收它.
难道我做错了什么?有谁知道如何可靠地确定用户何时在设备设置中切换位置服务?我希望能够在后台看到这些事件 - 即使我的应用程序没有运行.
我想我可以设置一个在后台运行的重复任务,并定期检查是否已切换位置服务,但这听起来很粗糙,效率低下.
如果它有帮助,我正在测试运行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上的三星Galaxy S3会为我制作广播,但在我将Map活动与测试位置提供商一起使用后就停止了.
无论如何,我现在决定停止追求这个问题.我认为Android只是个错误.
如果你做错了什么就没有看到你的代码很难说,但是我只是通过使用这里的代码作为指导来完成一个简单的示例工作和测试,并调整它以在库中安装BroadcastReceiver.
有一点需要注意:使用该库的应用程序需要receiver在其AndroidManifest.xml中使用.看到这里和这里,都包含来自@CommonsWare的信息.
在这里添加引用以防链接变坏:
库项目是否有任何方法可以在其自己的清单文件中独立注册接收器?
不是现在.
因此,任何使用您的库的应用都需要receiver在其AndroidManifest.xml中添加.
请注意,这是在三星S4上的Android 4.4.4上测试的.
我使用编译为a的库项目中的BroadcastReceiver工作了aar.
使用receiver链接到BroadcastReceiver库中的主应用程序的AndroidManifest.xml中设置的元素,我可以在对位置设置进行任何更改时收到该事件:
每次在位置设置中进行更改时,即使应用程序未运行,也会触发库中的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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在主应用程序中,我将编译好的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'
}
Run Code Online (Sandbox Code Playgroud)
receiver在主应用程序的AndroidManifest.xml中设置:
<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>
Run Code Online (Sandbox Code Playgroud)
然后,以几种不同的方式安装应用程序和修改位置设置.每次触发库中的BroadcastReceiver:




| 归档时间: |
|
| 查看次数: |
1694 次 |
| 最近记录: |