Die Geräteverwaltungs-App kann nicht deinstalliert werden, wenn sie nicht deaktiviert ist. Der Benutzer kann "Geräteadministratoren" in den Einstellungen deaktivieren. Wenn ein Unternehmen seinen Mitarbeitern Android-Geräte zur Verfügung stellt, möchte das Unternehmen Kontrolle über die Geräte, deren Status und Richtlinien haben, aber der Benutzer kann diese Kontrolle leicht loswerden. Weiß jemand, wie es möglich ist Benutzer daran zu hindern, die Geräteadministratoren zu deaktivieren? Danke!
Antworten
Zu viele Anzeigen?Es gibt keine Möglichkeit, den Benutzer daran zu hindern, Geräteadministratoren zu deaktivieren, zumindest nicht über die veröffentlichten APIs. Das Beste, was Sie tun können, ist, die Ausführung von Programmen zu unterbinden, wenn bestimmte Richtlinien nicht vorhanden sind.
Einige Hersteller (z. B. Samsung) haben die Basis-APIs erweitert, um zusätzliche Funktionen zu ermöglichen, die jedoch nicht Teil der Android-Standardplattform sind.
In DeviceAdminReceiver.java könnten Sie etwas wie folgt tun: onDisableRequested:
public CharSequence onDisableRequested(Context context, Intent intent) {
SharedPreferences settings = context.getSharedPreferences(MainActivity.class.getName(), 0);
String DEVICE_ADMIN_CAN_DEACTIVATE = settings.getString("DEVICE_ADMIN_CAN_DEACTIVATE", null);
if(DEVICE_ADMIN_CAN_DEACTIVATE.equals("ON")){
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startMain);
return "OOPS!";
}else{
String msg_char_onDisable = context.getResources().getString(R.string.msg_char_onDisable);
return msg_char_onDisable;
}
}
Es gibt einen Workaround, um die Deaktivierung des Geräteadministrators zu verhindern. Wenn der Benutzer die Deaktivierung einleitet und wir den Rückruf ACTION_DEVICE_ADMIN_DISABLE_REQUESTED erhalten, starten wir die Einstellungsaktivität erneut.
Das Betriebssystem lässt zu, dass eine Meldung angezeigt wird, in der der Benutzer um Bestätigung gebeten wird. Nach den Regeln des Android-Betriebssystems darf für etwa 5 Sekunden keine App über diesem Bestätigungsdialog gestartet werden. Die Einstellungsaktivität, die wir zu öffnen versucht haben, wird also erst nach 5 Sekunden gestartet.
Um diese 5 Sekunden zu überbrücken, ohne dass der Benutzer die Deaktivierung bestätigen kann, wird das Telefon vom Geräteadministrator wiederholt in einem Hintergrund-Thread gesperrt. Nach 5 Sekunden, wenn der Benutzer das Gerät entsperrt, wird die Aktivität "Einstellungen" neu gestartet.
Der folgende Code für die Klasse Device Admin Broadcast Receiver veranschaulicht die obige Methode.
DevAdminReceiver.java
public class DevAdminReceiver extends DeviceAdminReceiver {
DevicePolicyManager dpm;
long current_time;
Timer myThread;
@Override
public void onEnabled(@NonNull Context context, @NonNull Intent intent) {
super.onEnabled(context, intent);
Log.d("Root", "Device Owner Enabled");
}
@Nullable
@Override
public CharSequence onDisableRequested(@NonNull Context context, @NonNull Intent intent) {
Log.d("Device Admin","Disable Requested");
Intent startMain = new Intent(android.provider.Settings.ACTION_SETTINGS);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startMain);
dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
myThread = new Timer();
current_time = System.currentTimeMillis();
myThread.schedule(lock_task,0,1000);
return "Warning";
}
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) {
CharSequence res = onDisableRequested(context, intent);
if (res != null) {
dpm.lockNow();
Bundle extras = getResultExtras(true);
extras.putCharSequence(EXTRA_DISABLE_WARNING, res);
}
}else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) {
Log.d("Device Admin","Disabled");
}
}
// Repeatedly lock the phone every second for 5 seconds
TimerTask lock_task = new TimerTask() {
@Override
public void run() {
long diff = System.currentTimeMillis() - current_time;
if (diff<5000) {
Log.d("Timer","1 second");
dpm.lockNow();
}
else{
myThread.cancel();
}
}
};
}
Sicherstellen force lock
Richtlinie für den Geräteadministrator in der Ressourcendatei festgelegt ist.
Dies ist ein reiner Workaround und keine beabsichtigte Lösung von Seiten der Entwickler. Apps, die Geräteverwaltungsberechtigungen missbrauchen, werden meist aus dem Google Play Store entfernt, wenn sie veröffentlicht werden.
Der vollständige Beispielcode mit den erforderlichen Manifest-Deklarationen und der Ressource-xml-Datei befindet sich im folgenden Repository
https://github.com/abinpaul1/Android-Snippets/tree/master/PermanentDeviceAdministrator