android - 如何在 Android M - API 23 中读取选定的模拟位置应用程序

标签 android android-6.0-marshmallow

我正在尝试寻找一种方法来读取 Android M 中模拟位置的新设置。

在 Android M 之前,模拟位置设置是一个名为“使用模拟位置”的切换选项,使用此设置可读:Settings.Secure.ALLOW_MOCK_LOCATION

在Android M中,mock location setting是一个为mock locations选择的app,所以它是一个多元素列表,被选中的元素可以是“none”。

该线程有一个解决方案,用于在监听位置时确定位置更新的来源,但不幸的是我想阅读设置本身: How to check for Mock Location in Android Marshmallow?

我想了解是否有选定的模拟位置应用程序,最好还有选定的应用程序。欢迎任何关于如何做到这一点的想法!

最佳答案

好的,通过 android 开发者网站进行挖掘,这就是我想出的。你必须使用 AppOpsManager . checkOp("android:mock_location", "yourUID", "com.your.package.name")

我认为您可以通过更改包名称来检查是否启用了不同的应用。

public boolean isMockLocationEnabled(){
    boolean isMockLocation = false;
    try {
        //if marshmallow
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            AppOpsManager opsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
            isMockLocation = (opsManager.checkOp(AppOpsManager.OPSTR_MOCK_LOCATION, android.os.Process.myUid(), BuildConfig.APPLICATION_ID)== AppOpsManager.MODE_ALLOWED);
        } else {
            // in marshmallow this will always return true
            isMockLocation = !android.provider.Settings.Secure.getString(mContext.getContentResolver(), "mock_location").equals("0");
        }
    } catch (Exception e) {
        return isMockLocation;
    }
    return isMockLocation;
}

关于android - 如何在 Android M - API 23 中读取选定的模拟位置应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33003553/

相关文章:

android - Estimote 和 Gimbal 信标的正确 BeaconLayout 是什么

android - 为 Android 构建 FFmpeg

Android - 将操作系统升级到 Marshmallow 后,权限如何在已安装的应用程序上运行

Android:更新到 SDK 23 后的 java.land.NoSuchFieldError

android - 打瞌睡模式下的网络访问

java - 我可以确定 Realm 数据库文件内的实例数量吗?

android - 干净的架构模式 Android

java - 将 android View 引用保密好吗?

android - 权限拒绝 : android. permission.READ_EXTERNAL_STORAGE

安卓棉花糖 : Files written by SAF are not immediatelly written