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

问题描述 投票:12回答:4

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

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

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

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

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

android android-6.0-marshmallow
4个回答
20
投票

好的挖掘Android开发者网站,这就是我想出的。你必须使用AppOpsManagercheckOp("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;
}

3
投票

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

允许应用程序进行模拟位置

adb shell appops set <PACKAGE> android:mock_location allow

删除模拟位置的应用程序

adb shell appops set <PACKAGE> android:mock_location deny

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

adb shell appops get <PACKAGE> android:mock_location

0
投票
  PackageManager pm = context.getPackageManager();
    List<ApplicationInfo> packages =
            pm.getInstalledApplications(PackageManager.GET_META_DATA);

    for (ApplicationInfo applicationInfo : packages) {
        try {
            PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName,
                    PackageManager.GET_PERMISSIONS);

            // Get Permissions
            String[] requestedPermissions = packageInfo.requestedPermissions;

            if (requestedPermissions != null) {
                for (int i = 0; i < requestedPermissions.length; i++) {
                    if (requestedPermissions[i].equals("android.permission.ACCESS_MOCK_LOCATION")
                            && !applicationInfo.packageName.equals(context.getPackageName())) {
                        //we get Package name here
                    }
                }
            }
        } catch (PackageManager.NameNotFoundException e) {

        }
    }

0
投票

如果要检测当前或最近是否使用模拟位置。

    val manager = getSystemService(Context.LOCATION_SERVICE) as? LocationManager
    if (manager?.getLastKnownLocation(LocationManager.GPS_PROVIDER)?.isFromMockProvider == true) {
    // Mock locations are/were used
    }
© www.soinside.com 2019 - 2024. All rights reserved.