3

Ich bin ziemlich neu bei Android und ich entwickle derzeit eine Android App, die in KioskMode ausgeführt werden sollte, so dass ein normaler Benutzer die Anwendung nicht beenden oder nichts tun kann außerhalb davon.
Was habe ich schon:Android Kiosk-Modus - Verhindern, dass Benutzer die Anwendung "unbefugt" lösen

  • Ich habe meine App als Gerätebesitzer
  • I "Bildschirm pin" die App in der onCreate() - Methode in der MainActivity als Gerätebesitzer
  • Ich habe eine Schaltfläche in der MainActivity, mit der ein Administrator später durch Eingabe eines Passworts beenden kann. Anrufe stopLockTask()

Das Problem, das ich jetzt angetroffen wird, dass jeder Benutzer den Bildschirm verlassen kann Pinning durch einfache langes Drücken der Taste „zurück“ und „Multitasking“ Tasten gleichzeitig, weil die Tablette auf das die App laufen soll hardwarebuttons hat was ich nicht einfach deaktivieren kann. (zumindest weiß ich nicht, wie man das macht, ohne das Gerät zu rooten)
Gibt es also eine Möglichkeit, diese Tastenkombination zu deaktivieren, um das Pinning am Bildschirm zu beenden, oder eine nette Abhilfe? Ein Ansatz, an den ich dachte, war, die Anwendung in meiner AdminReceiver-Klasse in der onLockTaskModeExiting() neu zu pinnen, aber ich bin immer noch dabei, wie das geht.

Hier sind einige Code-Schnipsel meines MainActivity und die AdminReceiver Klasse:
AdminReceiver.java

public class AdminReceiver extends DeviceAdminReceiver{ 

@Override 
public void onEnabled(Context context, Intent intent) { 
    Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show(); 
} 

@Override 
public CharSequence onDisableRequested(Context context, Intent intent) { 
    return context.getString(R.string.device_admin_warning); 
} 

@Override 
public void onDisabled(Context context, Intent intent) { 
    Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) { 
    Toast.makeText(context, context.getString(R.string.kiosk_mode_enabled), Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onLockTaskModeExiting(Context context, Intent intent) { 
    Toast.makeText(context, context.getString(R.string.kiosk_mode_disabled), Toast.LENGTH_SHORT).show(); 
} 

}

MainActivity.java

public class MainActivity extends Activity { 

private DevicePolicyManager mDpm; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class); 
    mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 

    if (!mDpm.isAdminActive(deviceAdmin)) { 
     Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show(); 
    } 


    if (mDpm.isDeviceOwnerApp(getPackageName())) { 
     Toast.makeText(this, getString(R.string.device_owner), Toast.LENGTH_SHORT).show(); 

     mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()}); 
     startLockTask(); 
    } else { 
     Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show(); 
    } 

    Button exit = (Button) findViewById(R.id.exit); 
    exit.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      stopLockTask(); 
     } 
    });} 

Jede Hilfe wird sehr geschätzt. Vielen Dank!

+0

Wie stellen Sie Ihre App als Geräteinhaber ein? Wenn Ihre App tatsächlich als Gerätebesitzer festgelegt ist, wird auch die zuletzt verwendete Schaltfläche ausgeblendet. Weitere Informationen finden Sie im Beispiel-DPC. – bmg

+0

@Phil, ja, wie hast du Device Besitzer eingestellt? – portfoliobuilder

Antwort

0

Starten Sie Ihre Aktivität einfach neu und pinnen Sie den Bildschirm neu, wenn der Sperr-Task-Modus ohne Absicht beendet wurde.

@Override 
public void onLockTaskModeExiting(Context context, Intent intent) { 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
     if (sharedPreferences.getBoolean(PIN_SHOULD_ENABLED, false)) { 
      context.startActivity(new Intent(context, YOUR_PIN_SCREEN_ACTIVITY.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
    } 
} 
0

Wenn die Aktivität als DEFAULT gesetzt HOME

<activity 
     android:name=".AppActivity" 
     android:label="Locked Activity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <category android:name="android.intent.category.HOME"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
</activity> 

jedes Mal, wenn der Benutzer drücken Sie die Home-Taste kann die Aktivität die Sperre auf onCreate, onResume oder onStart wieder aktivieren. Wenn die App mit der Taste "Übersicht" und "Zurück" zwangsweise deaktiviert wurde und die Liste der letzten Aktivitäten leer ist, kann der Benutzer nur die Home-Taste drücken, wodurch die Sperre wieder aktiviert wird.

Da die Frage 12 Monate alt ist, bin ich auch immer noch auf der Suche nach einer effektiveren Lösung.

0

Ich hatte dieses Problem und versuchte Antworten in diesem Thread. Ich würde die Antwort von Xavier Lin nicht empfehlen, da es mehrere Instanzen Ihrer App erstellt.

Glücklicherweise habe ich eine eigene Lösung gefunden.

Erweitern Sie in Ihrer Klasse, die DeviceAdminReceiver erweitert, onLockTaskModeExiting, und führen Sie dort den Pincode aus.

public class AdminReceiver extends DeviceAdminReceiver{ 

    @Override 
    public void onLockTaskModeExiting(Context context, Intent intent) { 
     super.onLockTaskModeExiting(context, intent); 

     // Run pinning code here 
    } 
}