7

私はAndroidにはかなり慣れていません。現在、KioskModeで実行する必要があるAndroidアプリを開発しているため、通常のユーザーはアプリケーションを終了したり、アプリケーション以外で何かをしたりできません。
私がすでにしたこと:

  • アプリをデバイス所有者として設定しました
  • デバイス所有者として、MainActivity の onCreate() メソッドでアプリを「スクリーン ピン留め」します。
  • MainActivity にボタンがあり、後で管理者がパスワードを入力して終了できるようにします。stopLockTask() を呼び出します

私が今遭遇した問題は、アプリを実行するタブレットに単純に非アクティブ化できないハードウェアボタンがあるため、ユーザーは「戻る」ボタンと「マルチタスク」ボタンを同時に長押しするだけで画面固定を終了できることです。(少なくとも、デバイスをルート化せずにこれを行う方法はわかりません)
では、画面の固定を終了するためにこのボタンの組み合わせを無効にする方法、または適切な回避策はありますか?私が考えた 1 つのアプローチは、onLockTaskModeExiting() の AdminReceiver クラスでアプリケーションを再ピン留めすることでしたが、これを行う方法にまだ行き詰まっています。

MainActivityと AdminReceiver クラスのコード スニペットを次に示します。

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();
        }
    });}

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

0

ロックタスクモードが意図せずに終了した場合は、アクティビティを再開して画面を再度ピン留めしてください。

@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));
    }
}
于 2016-05-14T15:52:21.570 に答える