3

我對Android非常新,我目前正在開發一款應用程序,該應用程序應該在KioskMode中運行,以便普通用戶無法退出應用程序或執行任何操作在它之外。
我已經做了:Android Kiosk模式 - 防止用戶「未經授權」取消固定應用程序

  • 我把我的應用程序的設備所有者
  • 我「屏幕針」在OnCreate()的應用程序 - 方法在MainActivity作爲設備所有者
  • 我有MainActivity中的一個按鈕,稍後通過輸入密碼允許管理員退出。調用stopLockTask()

我現在遇到的,任何用戶都可以退出屏幕,只需長按「後退」,同時,「多任務處理」按鈕,因爲該應用程序應該運行在平板電腦具有hardwarebuttons釘扎問題我不能簡單地停用。 (至少我不知道如何做到這一點沒有根植設備)
那麼有沒有什麼辦法來停用這個按鈕組合來退出屏幕鎖定,或者一些整潔的解決方法? 我想到的一種方法是在onLockTaskModeExiting()的AdminReceiver類中重新編寫應用程序,但我仍然堅持如何執行此操作。

這裏是我的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

如果活動被設置爲每次用戶按home鍵的活動可以重新啓用onCreateonResumeonStartDEFAULTHOME

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

。如果應用程序使用概覽和後退鍵強制取消固定,並且最近的活動列表爲空,則用戶只能按Home鍵以重新啓用鎖定。

由於問題是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 
    } 
}