【问题标题】:How to read selected mock location app in Android M - API 23如何在 Android M 中读取选定的模拟位置应用程序 - API 23
【发布时间】:2016-01-05 08:28:48
【问题描述】:

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

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

在Android M中,mock location设置是一个选择mock位置的app,所以它是一个多元素列表,选择的元素可以是“none”。

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

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

【问题讨论】:

标签: android android-6.0-marshmallow


【解决方案1】:

好吧,通过 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;
}

【讨论】:

  • 感谢您的回答。不幸的是,这个答案只允许检查我自己的应用程序是否可以访问模拟位置,它不允许检查系统设置本身:例如,如果选择另一个应用程序作为模拟位置。
  • @androidseb 我的要求和你的完全一样。您是否找到任何解决方案来满足您的要求。也请指导我。谢谢!此外,我在 Marshmallow 上尝试了 Marlon 的解决方案并遇到了一个问题。在第一次尝试中,没有选择用于模拟的应用程序,因此我从这段代码中收到了预期的结果。然后我在设置中选择了 FakeGPS 模拟应用程序,我仍然得到了预期的结果(安全异常)。然后我在模拟应用程序中选择了Nothing,但是这段代码仍然给出了安全异常。我继续并停止了 FakeGPS 服务,但它仍然没有帮助。知道是什么原因造成的吗?
  • @LoveForDroid 我还没有找到扫描哪个应用程序被选为模拟位置的解决方案,我认为您的应用程序需要系统访问权限(也就是需要成为系统应用程序)才能使 Marlon 的解决方案工作,并且由于您的应用没有权限,这可能就是您获得安全异常的原因。我最终采取了不同的方法并检查了此处建议的位置更新:stackoverflow.com/questions/32668494/…
  • @androidseb 我不需要知道为模拟位置选择了哪个应用程序。我的确切要求是知道是否为模拟位置选择了任何应用程序。你能为此提出一些建议吗?因为我没有得到任何东西,所以我最终做了 location.isFromMockProvider()。但不幸的是,它总是返回真正的非物质我选择或不选择模拟应用程序。看起来 Fake GPS 会覆盖位置坐标,并且即使在我停止 Fake GPS 之后,位置管理器也不会刷新其坐标。
  • @LoveForDroid 不,我对此没有任何建议,因为我找不到有关为模拟位置配置的应用程序的任何信息,或者即使为模拟位置选择了一个应用程序,我也给了up 并用 FusedLocationProvider 使用 location 对象中的方法:Location.getExtras().getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false);
【解决方案2】:

对于那些尝试使用 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

【讨论】:

    【解决方案3】:

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

        val manager = getSystemService(Context.LOCATION_SERVICE) as? LocationManager
        if (manager?.getLastKnownLocation(LocationManager.GPS_PROVIDER)?.isFromMockProvider == true) {
        // Mock locations are/were used
        }
    

    【讨论】:

    • 这需要额外的权限和监听器
    • 它认为这很明显,您需要访问用户位置的权限。
    【解决方案4】:
      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) {
    
            }
        }
    

    【讨论】:

    • 这只是读取清单,但不一定意味着模拟位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多