3

Я довольно новичок в Android, и в настоящее время я разрабатываю приложение для Android, которое должно работать в KioskMode, чтобы обычный пользователь не мог выйти из приложения или сделать что-либо вне его.
То, что я уже сделал:Android Kiosk Mode - Предотвращение пользователей от «несанкционированного» отказа от приложения

  • Я установил мое приложение в качестве владельца устройства
  • I «экран контактный» приложение в OnCreate() - метод в MainActivity как владелец устройства
  • У меня есть кнопку в MainActivity, которая позже позволяет администратору выйти, введя пароль. Вызывает stopLockTask()

Проблема я столкнулся сейчас, что любой пользователь может выйти из экрана Закрепление просто долгое нажатие «назад» и «многозадачности» кнопки одновременно, так как планшет, на котором приложение должно работать имеет hardwarebuttons который я не могу просто отключить. (по крайней мере, я не знаю, как это сделать, не укореняя устройство)
Итак, есть ли способ деактивировать эту комбинацию кнопок для выхода из экрана или какого-нибудь аккуратного обходного пути? Один из подходов, который я думал о повторении приложения в моем классе AdminReceiver в onLockTaskModeExiting(), но я все еще придерживаюсь того, как это сделать.

Вот некоторые фрагменты кода моего MainActivity и класс AdminReceiver:
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(); 
     } 
    });} 

Любая помощь очень ценится. Благодаря!

+0

Как настроить приложение как владельца устройства? Если ваше приложение действительно установлено как Владелец устройства, кнопка с последним также будет скрыта. См. Образец DPC для получения дополнительной информации. – bmg

+0

@Phil, да, как вы установили владельца устройства? – portfoliobuilder

ответ

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

Если активность устанавливается как DEFAULTHOME

<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> 

каждый раз, когда пользователь нажимает на кнопку домой активность может повторно включить блокировку на onCreate, onResume или onStart. Если приложение было принудительно отменено с помощью клавиши обзора и возврата, а последний список активности пуст, пользователь может нажать только кнопку «домой», которая снова включит блокировку.

Поскольку вопрос составляет 12 месяцев, я все еще ищу более эффективное решение.

0

У меня была эта проблема и я попытался ответить в этой теме. Я бы не рекомендовал ответ Xavier Lin, так как он создал несколько экземпляров вашего приложения.

К счастью, я придумал свое решение.

В вашем классе, который расширяет DeviceAdminReceiver, переопределяет onLockTaskModeExiting и запускает там пин-код.

public class AdminReceiver extends DeviceAdminReceiver{ 

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

     // Run pinning code here 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^