Как читать выбранное приложение для определения местоположения в 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
}