簡體   English   中英

如何在鎖定屏幕應用程序中禁用Android中的主頁按鈕呢?

[英]How to disable home button in Android like lock screen apps do?

我知道很多次都會問這個問題,但我發現沒有一個解決方案可行。 我嘗試了下面給出的代碼......

   protected void onPause() {
   super.onPause();
    Intent intent = new Intent(this,LockActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT |Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    }

它的作用是當Android主屏幕啟動時它將當前活動再次帶到前面,但是當主屏幕啟動時,將活動再次帶到前面需要將近3-4秒。

我使用了一些鎖屏應用程序,當點擊主頁按鈕時,它們甚至都沒有啟動主屏幕。 我希望實現這樣的目標。

我還使用了onUserLeavesHint方法,onKeyDown方法和onKeyDispatch方法,但它們都沒有為我工作。

請不要回答或評論,因為無法在Android中禁用主頁按鈕。 對於這樣的答案或評論,我建議你在PlayStore上瀏覽一些鎖屏應用程序。 我還在github上找到了一個有源代碼的工作應用程序。 它正在我的手機上工作,應用程序使用disableKeyguard,但是當我在我的應用程序中執行相同操作時它不起作用(不支持disableKeyguard,但我使用@supress警告(“棄用”))。

來源 - https://github.com/shaobin0604/Android-HomeKey-Locker

//Copy this class
public class HomeKeyLocker {
    private OverlayDialog mOverlayDialog;
    public void lock(Activity activity) {
        if (mOverlayDialog == null) {
            mOverlayDialog = new OverlayDialog(activity);
            mOverlayDialog.show();
        }
    }
    public void unlock() {
        if (mOverlayDialog != null) {
            mOverlayDialog.dismiss();
            mOverlayDialog = null;
        }
    }
    private static class OverlayDialog extends AlertDialog {

        public OverlayDialog(Activity activity) {
            super(activity, R.style.OverlayDialog);
            WindowManager.LayoutParams params = getWindow().getAttributes();
            params.type =  WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
            params.dimAmount = 0.0F; // transparent
            params.width = 0;
            params.height = 0;
            params.gravity = Gravity.BOTTOM;
            getWindow().setAttributes(params);
            getWindow().setFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |  WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 0xffffff);
            setOwnerActivity(activity);
            setCancelable(false);
        }

        public final boolean dispatchTouchEvent(MotionEvent motionevent) {
            return true;
        }

        protected final void onCreate(Bundle bundle) {
            super.onCreate(bundle);
            FrameLayout framelayout = new FrameLayout(getContext());
            framelayout.setBackgroundColor(0);
            setContentView(framelayout);
        }
    }
}

//Paste this in your activity
mHomeKeyLocker = new HomeKeyLocker();
mHomeKeyLocker.lock(this);

提供完美無根鎖屏功能的可靠方法是將您的“儲物櫃”應用程序理念與啟動器應用程序相結合。

清單中的簡單更改將允許您的應用注冊為主屏幕/啟動器,這將使您的.apk 完全控制主頁按鈕:

<application
    android:launchMode="singleTask"
    android:clearTaskOnLaunch="true"
    android:stateNotNeeded="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="ch.arnab.simplelauncher.HomeScreen"
        android:label="@string/app_name"
        android:launchMode="singleTask"
        android:excludeFromRecents="true"
        android:screenOrientation="nosensor">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <!-- These 2 intent-filters identify a launcher: -->
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

本教程中拉出來

然后,您將有兩個活動,一個用於主屏幕,一個用於鎖定屏幕。

您必須檢測屏幕何時關閉/打開 ,以顯示鎖定屏幕活動:

public class MainActivity extends Activity {

    //Create a receiver for screen-on/screen-off
    BroadcastReceiver mybroadcast = new BroadcastReceiver() {   
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                //Show lock-screen
            }
            else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                //Also show lock-screen, to remove flicker/delay when screen on?
            }

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

        registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
        registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));
    }
}

這個答案中拉出來

僅供參考:由於您的“鎖定屏幕”此時仍將被視為啟動器的一部分,因此應用程序將能夠在您的鎖定屏幕上啟動,這在以下情況下會很糟糕: 用戶可以訪問通知抽屜以點擊消息/推文等 ,但也可以是好的: 能夠在不解鎖手機的情況下接聽來電。

無論哪種方式,您的鎖定屏幕活動應覆蓋onPause ,檢查用戶是否“已通過身份驗證”,如果不是,則假定用戶打開了某些內容並應返回鎖定屏幕:

@Override
public void onPause() {
    super.onPause();
    if(password!=storedPassword) {
      //Lockscreen activity shouldn't ever be escaped without the right password!
      //Return to launcher without root!
      Intent homeIntent = new Intent(Intent.ACTION_MAIN);
      homeIntent.addCategory(Intent.CATEGORY_HOME);
      homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(homeIntent);
    }
}

為了獲得更好的用戶體驗,您應該讓用戶選擇允許一些應用程序繞過鎖屏(例如Spotify),您可以在上面的if語句中包含它(例如if(password!=storedPassword||isForegroundAppSpotify) ) 。

至於在主屏幕上加載應用,您可以參考Google上的教程來創建自己的啟動器活動。

組合啟動器+鎖定屏幕是避免root訪問的最簡單方法。 您可能會發現使用root更容易,但您將限制您的客戶群。

希望這可以幫助!

您可以使用shaobin0604庫來執行此操作。 它也會禁用“后退”按鈕。 您的活動將如下所示:


public class MainActivity extends Activity {

HomeKeyLocker homeKeyLocker;

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

    homeKeyLocker = new HomeKeyLocker();
    homeKeyLocker.lock(this);
}

}

我已經做了很多研究來設計鎖屏,最后找到了解決方案。 Android禁用該功能以覆蓋除后退按鈕以外的系統欄。 但是有一些工作要做到這一點:

耐心地理解並實施屏幕釘扎 ,您將獲得成功。

您可以創建一個應用程序來控制您想要實現屏幕固定的所有應用程序,或者您可以直接在要固定的同一應用程序中實現屏幕固定。

我將向您展示本文后面的實現:

1.首先,您的應用應該是設備所有者。

您可以通過多種方式完成此操作,最簡單的方法是執行命令:

adb shell dpm set-device-owner [yourPackageName] /。[MyDeviceAdminReceiver]

創建一個擴展DeviceAdminReceiver的接收器(MyDeviceAdminReceiver)。 你不需要在這里有任何代碼。 有關設備所有者實施的更多信息,請參閱此鏈接
http://florent-dupont.blogspot.com/2015/02/10-things-to-know-about-device-owner.html

以這種方式在AndroidManifest.xml文件中注冊接收器:

<receiver
       android:name=".MyDeviceAdminReceiver"
       android:label="@string/app_name"
       android:permission="android.permission.BIND_DEVICE_ADMIN">
     <meta-data
       android:name="android.app.device_admin"
       android:resource="@xml/device_admin" />

       <intent-filter>
         <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
       </intent-filter>
  </receiver>

2.你的onCreate方法應如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lock_screen);

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


    if (mDpm.isDeviceOwnerApp(getPackageName())) {
        mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()});
    }

    if (mDpm.isLockTaskPermitted(this.getPackageName()))
        startLockTask();

3.取消固定屏幕並使導航欄功能

在代碼中要取消固定的位置調用函數stopLockTask() 例如,在我的應用程序中,只要我驗證用戶輸入了正確的密碼,我就調用此函數:

 if (userInput.length() == 4) {

                    if (userInput.equals(passcode)) {
                        userInput = "";
                        etxtPasscodeDisplay.setText("");
                        stopLockTask(); // this is what you need
                        unlockHomeButton(); // A method to show home screen when 
                         passcode is correct
                        finishAffinity(); //kill other activities
                    }

鎖屏通常需要的額外信息:

1.如果你的應用程序是啟動后出現的第一件事

您需要一個服務(StartAtBootService)和一個接收器(BootCompletedReceiver)。

2.如果您希望在屏幕鎖定和解鎖后按下應用程序 (按下電源按鈕以鎖定和解鎖):

創建擴展服務的 AEScreenOnOffService和擴展BroadcastReceiver的 AEScreenOnOffReceiver,以在屏幕打開時啟動您的活動。

有關我在此提及的所有內容的詳細信息,請參閱http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/
這是一篇很棒的寫作,對我幫助很大。 特別感謝作者。

我需要至少10個聲望才能發布超過兩個鏈接。 由於我是stackoverflow的新手,因此我沒有足夠的聲譽,所以我很抱歉無法分享我提到的所有鏈接。 一旦我獲得訪問權限,肯定會更新帖子。

簡單回答你的問題是你做不到。

大約四年前,我提出了你提到的解決方案[Link]

onUserLeavesHint,onKeyDown和onKeyDispatch永遠不會“禁用”硬件密鑰。

如果你真的想要“處理”主頁按鈕,你必須將你的應用程序作為主屏幕。 看到這個這個

如果您確實要在不創建主屏幕應用程序的情況下禁用硬件密鑰,則應該根據設備進行root操作並從內核模塊中刪除相應的設備文件。 (請自擔風險!)

你可以做的是覆蓋主鍵功能,如下所示:

@Override public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        //The Code Want to Perform.
    }
});

然后,您應該能夠阻止用戶使用此按鈕返回主屏幕。 希望對你有用。

編輯:覆蓋主頁按鈕的問題是谷歌認為它是一個安全漏洞,所以每當有人找到覆蓋它的方法時谷歌會修補這個“漏洞”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM