如何禁用Android中的主屏幕button,如锁屏应用程序吗?

我知道这个问题被问了很多次,但我发现没有任何解决scheme正在工作。 我尝试了下面给出的代码…

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

它的function是在Android主屏幕启动时将当前活动再次提前,但启动主屏幕时,需要将近3到4秒的时间才能将活动重新启动。

我已经使用了一些锁屏应用程序,甚至在单击主屏幕button时甚至不能启动主屏幕。 我想要实现这样的事情。

我也使用onUserLeavesHint方法,onKeyDown方法和onKeyDispatch方法,但他们都没有为我工作。

而且请不要回答或评论,如不能禁用Android中的主页button。 对于这样的答案或评论,我build议你通过PlayStore上的锁屏应用程序。 另外,我还在源代码上的github上find了一个工作应用程序。 它正在我的手机和应用程序使用disableKeyguard,但是当我在我的应用程序中也一样,它不起作用(disableKeyguard已弃用,但我使用@supress警告(“deprecation”))。

  • SQLite连接和locking
  • lockingAndroid设备只运行一个应用程序
  • Sqlite数据库实例是线程安全的
  • android解锁屏幕的意图?
  • 屏幕方向locking
  • 如何在locking屏幕上显示未接电话号码?
  • lockingAuth0的Android没有返回UserProfile身份validation
  • Android活动生命周期和locking/解锁设备
  • 源 – 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); 

    提供无瑕疵,非根lockingfunction的可靠方法是将您的“更衣室”应用程序的想法与启动程序相结合。

    清单中的一个简单更改将允许您的应用程序注册为主屏幕/启动器,这将使您的.apk 完全控制主页button:

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

    拉本教程

    然后你将有两个活动,一个用于你的主屏幕,一个用于你的锁屏。

    您必须检测屏幕何时closures/打开 ,才能显示您的锁屏活动:

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

    从这个答案拉

    仅供参考:由于您的“锁屏”在这一点上仍将被视为启动程序的一部分,所以应用程序将能够在您的locking屏幕上启动,这在以下情况下是不利的: 用户可以访问通知抽屉来点击消息/推文等 ,但也可以是: 在没有解锁手机的情况下能够接听来电。

    无论哪种方式,你的锁屏活动应该覆盖onPause ,检查用户是否“authentication”,如果他不是,假设用户打开的东西,应该回到锁屏:

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

    为了更好的用户体验,你应该给你的用户select允许几个应用程序绕过锁屏(比如Spotify),你可以在上面的if语句中包含它(例如if(password!=storedPassword||isForegroundAppSpotify) ) 。

    至于在主屏幕上加载应用程序,您可以参考Google上的教程来创build自己的启动器活动。

    结合启动器+locking屏幕是避免root访问最简单的方法。 您可能会发现使用root更容易,但是会限制您的客户群。

    希望这可以帮助!

    你可以使用shaobin0604库来做到这一点。 它也将禁用后退button。 你的活动将如下所示:

     public class MainActivity extends Activity { 

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

    }

    我已经做了大量的研究来devise一个锁屏,最终find了一个解决scheme。 Android禁用了该function来覆盖除了后退button之外的系统栏。 但是有一点工作要做:

    理解并实施耐心的屏幕locking ,你将会成功。

    你可以创build一个应用程序来控制你想要实现的所有应用程序的屏幕locking,或者你可以直接在你想要locking的应用程序中实现屏幕locking。

    我将向您展示本文后面的实现:

    1.首先你的应用程序应该是设备所有者。

    你可以用几种方法来完成,最简单的是执行命令:

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

    创build一个扩展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.要取消固定屏幕并使导航栏有效

    在代码中您要解除locking的位置调用stopLockTask()函数。 例如在我的应用程序中,只要我确认用户input了正确的密码,我就调用这个函数:

      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.如果您希望您的应用程序在屏幕locking和解锁 (电源button被locking和解锁)后显示:

    创build扩展服务的 AEScreenOnOffService和扩展BroadcastReceiver的 AEScreenOnOffReceiver,以便在启动屏幕时启动您的活动。

    有关我在这里提到的所有内容的详细信息,请参阅http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/
    这是一个很好的写作,帮助了我很多。 特别感谢作者。

    我需要至less10个声望发布两个以上的链接。 由于我是新的stackoverflow我没有足够的声誉,所以我很抱歉无法分享我所指的所有链接。 一旦我获得访问,肯定会更新这个post。

    简单的回答你的问题是你不能这样做。

    你提到的解决scheme是我四年前提出的[链接] 。

    onUserLeavesHint,onKeyDown和onKeyDispatch永远不会“禁用”硬件密钥。

    如果你真的想“处理”主页button,你将不得不把你的应用程序作为主屏幕。 看到这个和这个 。

    如果您真的想要禁用您的硬件密钥而无需创build主屏幕应用程序,则应该为您的设备创build根目录,并从内核模块中删除相应的设备文件。 (请自行承担风险!)

    你可以做的是覆盖主键function,如下所示:

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

    那么你应该能够阻止用户使用这个button回到主屏幕。 希望这对你有用。

    编辑:重写主页button的问题是它被认为是由谷歌的安全漏洞,所以每次有人发现一种方式来覆盖它谷歌补丁这个“漏洞”。