Как читать выбранное приложение для определения местоположения в Android M - API 23

Я пытаюсь найти способ прочитать новые настройки для макетов в Android M.

Перед Android M настройка расположения макета была опцией переключения, называемой "использование макетов", и она была доступна для чтения с помощью этого параметра: Settings.Secure.ALLOW_MOCK_LOCATION

В Android M параметр определения местоположения является приложением для выбора макетов, поэтому он представляет собой список нескольких элементов, который выбранный элемент может быть "none".

В этом потоке есть решение для определения источника обновления местоположения при прослушивании местоположений, но, к сожалению, я хотел бы прочитать настройку: Как проверить местоположение Mock в Android Marshmallow?

Я хотел бы узнать, есть ли выбранное приложение для макетов или нет, и, в идеале, выбранное приложение. Любая идея о том, как это сделать, приветствуется!

Ответ 1

Хорошо копаясь через сайт разработчика 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;
}

Ответ 2

Для тех, кто пытается это сделать с помощью ADB, вот команды для получения и настройки приложения mock:

Разрешить приложение для макета locaiton

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

  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) {

        }
    }

Ответ 4

Если вы хотите определить, используются ли макетные местоположения в настоящее время или недавно.

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