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

and*_*seb 13 android android-6.0-marshmallow

我试图找到一种方法来读取Android M中模拟位置的新设置.

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

使用Android M,模拟位置设置是一个用于选择模拟位置的应用程序,因此它是一个多元素列表,其中所选元素可以是"无".

该线程有一个解决方案,用于在侦听位置时确定位置更新的来源,但不幸的是我想阅读设置本身: 如何检查Android Marshmallow中的模拟位置?

我想知道是否有一个选定的模拟位置的应用程序,理想情况下也是所选的应用程序.欢迎任何有关如何做到这一点的想法!

Mar*_*lon 21

好的挖掘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;
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答.不幸的是,这个答案只允许检查我自己的应用程序是否可以访问模拟位置,它不允许检查系统设置本身:例如,如果为模拟位置选择了另一个应用程序. (4认同)

Pab*_*ter 5

对于那些尝试使用ADB进行此操作的人,以下是用于获取和设置模拟应用程序的命令:

允许应用进行模拟定位

adb shell appops set <PACKAGE> android:mock_location allow
Run Code Online (Sandbox Code Playgroud)

删除应用以获取模拟位置

adb shell appops set <PACKAGE> android:mock_location deny
Run Code Online (Sandbox Code Playgroud)

检查应用是否设置了模拟位置

adb shell appops get <PACKAGE> android:mock_location
Run Code Online (Sandbox Code Playgroud)