如何禁用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”))。

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

源 – 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的问题是它被认为是由谷歌的安全漏洞,所以每次有人发现一种方式来覆盖它谷歌补丁这个“漏洞”。