其他分享
首页 > 其他分享> > android – 监控库中的位置设置

android – 监控库中的位置设置

作者:互联网

我正在开发一个可用于监控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上的三星Galaxy S3会为我制作广播,但在我将Map活动与测试位置提供商一起使用后就停止了.

无论如何,我现在决定停止追求这个问题.我认为Android只是个错误.

解决方法:

如果你做错了什么就不用看你的代码就很难说,但是我只是通过使用here中的代码作为指南来完成一个简单的例子并进行测试,并将其调整为在一个库中安装BroadcastReceiver.

有一点需要注意:使用该库的应用程序需要在其AndroidManifest.xml中安装接收器.
参见herehere,两者都包含来自@CommonsWare的信息.

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

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

  
  不是现在.

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

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

我在编译为aar的库项目中使用BroadcastReceiver工作.

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

>位置切换
>位置关闭
>将位置模式更改为高精度
>将位置模式更改为节电
>仅将位置模式更改为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
        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:

标签:android-geofence,android
来源: https://codeday.me/bug/20191001/1837736.html