2016-01-21 50 views
1

我需要在我的應用程序的任何活動中禁用3個虛擬按鈕。不知何故,我禁用了後退按鈕和多任務按鈕,但我無法設置主頁按鈕。如何在任何活動中禁用虛擬主頁按鈕?

我試過onAttachedToWindow()樣式的答案在stackoverflow但他們沒有爲我工作。

我不想禁用整個應用程序的主頁按鈕,我只是想在一個活動窗口中禁用它。感謝您的幫助!

回答

2

注意:我強烈建議您不要在您的應用中執行此操作,如果您要部署它。這只是爲了展示我們如何做到這一點。

由於Android 4沒有有效的方法來禁用主頁按鈕,它需要一點破解。我認爲你的需求是在應用程序中的KIOSK模式。總的來說,這個想法是檢測一個新應用程序何時處於前臺,並立即重新啓動您的應用程序Activity。該工藝如下..

首先創建一個名爲KioskService類,它擴展Service並添加以下代碼片段:

public class KioskService extends Service { 

    private static final long INTERVAL = TimeUnit.SECONDS.toMillis(2); // periodic interval to check in seconds -> 2 seconds 
    private static final String TAG = KioskService.class.getSimpleName(); 
    private static final String PREF_KIOSK_MODE = "pref_kiosk_mode"; 

    private Thread t = null; 
    private Context ctx = null; 
    private boolean running = false; 

    @Override 
    public void onDestroy() { 
    Log.i(TAG, "Stopping service 'KioskService'"); 
    running =false; 
    super.onDestroy(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i(TAG, "Starting service 'KioskService'"); 
    running = true; 
    ctx = this; 

    // start a thread that periodically checks if your app is in the foreground 
    t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     do { 
      handleKioskMode(); 
      try { 
      Thread.sleep(INTERVAL); 
      } catch (InterruptedException e) { 
      Log.i(TAG, "Thread interrupted: 'KioskService'"); 
      } 
     }while(running); 
     stopSelf(); 
     } 
    }); 

    t.start(); 
    return Service.START_NOT_STICKY; 
    } 

    private void handleKioskMode() { 
    // is Kiosk Mode active? 
     if(isKioskModeActive()) { 
     // is App in background? 
     if(isInBackground()) { 
     restoreApp(); // restore! 
     } 
    } 
    } 

    private boolean isInBackground() { 
    ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); 

    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
    ComponentName componentInfo = taskInfo.get(0).topActivity; 
    return (!ctx.getApplicationContext().getPackageName().equals(componentInfo.getPackageName())); 
    } 

    private void restoreApp() { 
    // Restart activity 
    Intent i = new Intent(ctx, MyActivity.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    ctx.startActivity(i); 
    } 

    public boolean isKioskModeActive(final Context context) { 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
    return sp.getBoolean(PREF_KIOSK_MODE, false); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
    return null; 
    } 
} 

添加以下方法在AppContext類通過應用程序上下文創建開始service

@Override 
public void onCreate() { 
    super.onCreate(); 
    instance = this; 
    registerKioskModeScreenOffReceiver(); 
    startKioskService(); // add this 
} 

private void startKioskService() { // ... and this method 
    startService(new Intent(this, KioskService.class)); 
} 

AppContext類看起來像這樣

public class AppContext extends Application { 

    private AppContext instance; 
    private PowerManager.WakeLock wakeLock; 
    private OnScreenOffReceiver onScreenOffReceiver; 


    @Override 
    public void onCreate() { 
    super.onCreate(); 
    instance = this; 
    registerKioskModeScreenOffReceiver(); 
    } 

    private void registerKioskModeScreenOffReceiver() { 
    // register screen off receiver 
    final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
    onScreenOffReceiver = new OnScreenOffReceiver(); 
    registerReceiver(onScreenOffReceiver, filter); 
    } 

    public PowerManager.WakeLock getWakeLock() { 
    if(wakeLock == null) { 
     // lazy loading: first call, create wakeLock via PowerManager. 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "wakeup"); 
    } 
    return wakeLock; 
    } 
} 

添加服務宣言和檢索前臺進程清單的權限:

<service android:name=".KioskService" android:exported="false"/> 
<uses-permission android:name="android.permission.GET_TASKS"/> 
//Added permission Edit 1 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

我已經看到了這一切在一個網站,但忘記了鏈接,無論我有什麼只是內容和代碼,所以我張貼全部作爲答案。一旦我獲得鏈接,我會與你分享。

+0

你在哪裏定義了registerKioskModeScreenOffReceiver()? – kagkar

+0

@kagkar我找到了你正在尋找的鏈接..你需要或你離開它嗎? –

+0

@ShreeKrishna你可以給鏈接? –

2

如果我沒有錯,那麼你想禁用home按鈕,或者你可以說你的活動保持在每個活動屏幕的前面。

爲此,我建議你用窗口管理器屏幕開始你的活動窗口。當您使用窗口管理器開始您的活動時,您的主頁按鈕活動將變爲背景。這意味着您的活動無法通過點擊主頁按鈕關閉。

因此,簡單地將您的活動用作窗口管理器活動。許多鎖屏應用程序也工作在這種方式

抱歉代碼。我不能發佈代碼,因爲我離開了android編程,現在我正在使用動畫,所以你可能必須爲此努力工作。

但是,您可以通過窗口管理器活動來擊敗主頁按鈕和所有其他系統按鈕。

我有我的不完整的鎖屏應用程序項目。您必須進行一些更改並刪除不需要的java類文件和適配器文件。

此外,我在屏幕上開發了81個圖像的新鎖。兩個解鎖手機,你必須設置你選擇的圖像。

您可以從here下載我的不完整項目。

我更新鏈接並知道它的作品。

+0

您的下載鏈接不工作! –

+0

請將您的代碼上傳到github或bitbucket – kord

+0

我更新我的鏈接,現在從那裏下載工作文件。 @RamyAly – hardwork

相關問題