【问题标题】:How to check displaying mock location in android? [without using location]如何检查在android中显示的模拟位置? [不使用位置]
【发布时间】:2018-02-28 09:12:23
【问题描述】:

我需要检查是否有任何虚假应用在开发者设置中使用了位置信息。所以我需要让用户将其更改为开发人员设置。

但我需要使用而不使用位置。我尝试了这种方法,但即使我启用了虚假应用位置,也会显示未启用的 toast 消息。

public static boolean isMockLocationEnabled(Context context)
    {
        boolean isMockLocation = false;
        try {
            //if marshmallow
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                AppOpsManager opsManager = (AppOpsManager) context.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(context.getContentResolver(), "mock_location").equals("0");
            }
        } catch (Exception e) {
            return isMockLocation;
        }
        return isMockLocation;
    }



 MainActivity:

 @Override
protected void onStart() {
    super.onStart();
    if (AppUtils.isMockLocationEnabled(this)) {
        Log.e("Location..............", "enabled");
    } else {
        Log.e("Location..............", "not enabled"); //it always goes here in 8.0
    }
}

那么没有位置,如何通过?因为我只需要检查是否使用了虚假位置?

//location.isFromMockProvider(); // 没有位置怎么用?

那么还有其他解决方案吗?

【问题讨论】:

    标签: android android-studio android-location


    【解决方案1】:

    您可以检查 Mock 选项是否打开:

    if (Settings.Secure.getString(context.getContentResolver(),
                                    Settings.Secure.ALLOW_MOCK_LOCATION).equals("0"))
            return false;
        else
            return true;
    

    或者您可以检测是否有应用程序正在使用 Mock:

     boolean isExisted = false;
    
        PackageManager pm = getPackageManager();
        List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    
        for (ApplicationInfo applicationInfo : packages) {
    
            try {
                PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName,
                        PackageManager.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())) {
                            isExisted = true;
                            break;
                        }
                    }
                }
            } catch (NameNotFoundException e) {
                Log.e("Got exception " , e.getMessage());
            }
        }
    

    【讨论】:

    • 但我因为安全异常而崩溃。
    • 你能更新你的代码吗?什么是下午?它对应的是哪个?和 applicationInfo 也是
    • 当然,刚刚做了。
    • 谢谢你能告诉我什么是包吗?显示错误。
    • 是否列出 packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);这个?
    猜你喜欢
    • 2015-12-16
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多