我正试图找到一种方法来阅读Android M中模拟位置的新设置。
在Android M之前,模拟位置设置是一个名为&#34的切换选项;使用模拟位置",使用此设置可以读取它:void*
使用Android M,模拟位置设置是一个用于选择模拟位置的应用程序,因此它是一个多元素列表,所选元素可以是" none"。
该线程有一个解决方案,用于在侦听位置时确定位置更新的来源,但不幸的是我想阅读设置本身: How to check for Mock Location in Android Marshmallow?
我想了解是否有一个选定的模拟位置应用程序,理想情况下也是选定的应用程序。欢迎任何有关如何做到这一点的想法!
答案 0 :(得分:20)
好的挖掘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;
}
答案 1 :(得分: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
答案 2 :(得分:0)
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) {
}
}
答案 3 :(得分:0)
如果要检测当前或最近是否使用模拟位置。
val manager = getSystemService(Context.LOCATION_SERVICE) as? LocationManager
if (manager?.getLastKnownLocation(LocationManager.GPS_PROVIDER)?.isFromMockProvider == true) {
// Mock locations are/were used
}