Shadow
Shadow

Reputation: 6899

How to check displaying mock location in android? [without using location]

I need to check whether any fake app using location in developer settings. So that I need to make user to change it to developer setting.

But I need to use without using location. I tried this method but this displays not enabled toast message eventhough I enabled the fake app location.

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
    }
}

So without location, how to pass? Because I just need to check whether fake location is using or not?

//location.isFromMockProvider(); // without location how to use?

So any other solution?

Upvotes: 0

Views: 2680

Answers (1)

Cao Minh Vu
Cao Minh Vu

Reputation: 1948

You can check whether the Mock options is ON:

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

Or you can detect if there is an application which is using 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());
        }
    }

Upvotes: 1

Related Questions