How to Block an Android Application from using a Permission
-
24-05-2021 - |
문제
If an application has the "android.permission.CAMERA", and I wanted my app to block the use of this permission when it tries to access the Camera Hardware,"for security reasons" how could I block the process?
*NOTE: Let's assume that My app has all of the permissions...
해결책
You need to use the Device Administration API. Starting with Android 4.0 you can disable use of the camera with setCameraDisabled
다른 팁
I don't know of any non-rooted solutions, however there is an app on the android market called "Android Permission Blocker" that can block individual app permissions on an app basis. It only costs 99 cents so I tried it out and have been using it with success every since. Worth every penny in my opinion.
I hate when programmers say "this is impossible!" I think "there is always a way out"
public static void killAppByPermission (Context context, String permissionToKill)
{
try
{
PackageManager p = context.getPackageManager();
final List <PackageInfo> appinstall = p.getInstalledPackages(PackageManager.GET_PERMISSIONS);
for(PackageInfo pInfo:appinstall)
{
String[] reqPermission = pInfo.requestedPermissions;
if(reqPermission != null)
{
for(int i=0;i<reqPermission.length;i++)
{
if (((String)reqPermission[i]).toLowerCase().contains(permissionToKill.toLowerCase()))
{
killAppByPackName(pInfo.packageName.toString());
break;
}
}
}
}
}
catch (Throwable t){t.printStackTrace();}
}
public static void killAppByPackName (String packageToKill)
{
try
{
ActivityManager actvityManager = (ActivityManager) Sett.context.getSystemService(Context.ACTIVITY_SERVICE);
final List<RunningAppProcessInfo> procInfos = actvityManager.getRunningAppProcesses();
for (RunningAppProcessInfo runningAppProcessInfo : procInfos)
{
//Log.e("running",runningAppProcessInfo.processName);
if(runningAppProcessInfo.processName.toLowerCase().contains(packageToKill.toLowerCase()))
{
android.os.Process.sendSignal(runningAppProcessInfo.pid, android.os.Process.SIGNAL_KILL);
actvityManager.killBackgroundProcesses(packageToKill);
//Log.e("killed", "!!! killed "+ packageToKill);
}
}
}
catch (Throwable t){History.Error(t);}
}
public static void killAppByName (Context context, String appNameToKill)
{
try
{
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> listOfProcesses = manager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo process : listOfProcesses)
{
if (process.processName.toLowerCase().contains(appNameToKill.toLowerCase()))
{
//Log.e("killed", process.processName);
manager.killBackgroundProcesses(process.processName);
break;
}
}
}
catch (Throwable t){t.printStackTrace();}
}