<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
+ <uses-permission android:name="android.permission.REAL_GET_TASKS" />
<!-- For PBAP Owner Vcard Info -->
<uses-permission android:name="android.permission.READ_PROFILE"/>
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
throw new SecurityException("Need ACCESS_COARSE_LOCATION or "
+ "ACCESS_FINE_LOCATION permission to get scan results");
} else {
+ // Pre-M apps running in the foreground should continue getting scan results
+ if (isForegroundApp(context, callingPackage)) {
+ return true;
+ }
Log.e(TAG, "Permission denial: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION "
+ "permission to get scan results");
}
return false;
}
+ /**
+ * Return true if the specified package name is a foreground app.
+ *
+ * @param pkgName application package name.
+ */
+ private static boolean isForegroundApp(Context context, String pkgName) {
+ ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
+ List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
+ return !tasks.isEmpty() && pkgName.equals(tasks.get(0).topActivity.getPackageName());
+ }
+
private static boolean isAppOppAllowed(AppOpsManager appOps, int op, String callingPackage) {
return appOps.noteOp(op, Binder.getCallingUid(), callingPackage)
== AppOpsManager.MODE_ALLOWED;