当前位置: 首页 > 知识库问答 >
问题:

覆盖电源按钮,就像主页按钮一样

汲睿
2023-03-14

好吧,我正在做一些事情,我想禁用设备的所有硬按钮。

硬按钮,如电源、主页、调高音量、调低音量、搜索、返回。

除了Power,我已经成功地覆盖了这里的几乎所有按钮。

所以我只想让你们看到,请分享一些想法,这样我就可以不受影响了。

我在DispatchKeyEvent()上获得长按电源键事件,就像我想抓住相同的短按一样。此外,当按下电源时,我还试图通过获取SCREEN_OFF广播来停止屏幕关闭,我成功地接收了它,但我无法处理它。

谢谢。

然后,我创建了一个接收器屏幕,用于接收屏幕开/关的广播

ReceiverScreen.java

public class ReceiverScreen extends BroadcastReceiver {

    public static boolean wasScreenOn = true;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            // do whatever you need to do here
            wasScreenOn = false;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            // and do whatever you need to do here
            wasScreenOn = true;
        }
    }
}

禁用硬件按钮.java

public class DisableHardButton extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    BroadcastReceiver mReceiver = new ReceiverScreen();
    registerReceiver(mReceiver, filter);
    }

@Override
    protected void onPause() {
        // when the screen is about to turn off
        if (ScreenReceiver.wasScreenOn) {
            // this is the case when onPause() is called by the system due to a screen state change
            System.out.println("SCREEN TURNED OFF");

    } else {
        // this is when onPause() is called when the screen state has not changed
    }
    super.onPause();
}

@Override
protected void onResume() {
    // only when screen turns on
    if (!ScreenReceiver.wasScreenOn) {
        // this is when onResume() is called due to a screen state change
        System.out.println("SCREEN TURNED ON");
    } else {
        // this is when onResume() is called when the screen state has not changed
    }
    super.onResume();
}
}

共有3个答案

齐献
2023-03-14

以下是我所做的:

(1)创建一个接收者类:

public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        switch (action) {
            case Intent.ACTION_SCREEN_OFF:
                BaseActivity.unlockScreen();
                break;

            case Intent.ACTION_SCREEN_ON:
                // and do whatever you need to do here
                BaseActivity.clearScreen();
        }
    }
}

(2)上面调用的两个方法如下所示:

public static void unlockScreen () {
    if (current == null) return;

    Log.i( Constants.TAG, "Turning on screen ... " );

    Window window = current.getWindow();
    window.addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD );
    window.addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED );
    window.addFlags( WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON   );
}

public static void clearScreen () {
    if (current == null) return;

    Log.i( Constants.TAG, "Clearing screen flag when on ... " );

    Window window = current.getWindow();
    window.clearFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD );
    window.clearFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED );
    window.clearFlags( WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON   );
}

private static BaseActivity current;

@Override
protected void onResume () {
    current = this;
}

(3) 在主活动类onCreate()方法中注册接收器:

    IntentFilter filter = new IntentFilter( Intent.ACTION_SCREEN_ON );
    filter.addAction( Intent.ACTION_SCREEN_OFF );
    registerReceiver(new ScreenReceiver(), filter);
支阳波
2023-03-14

与所有的答案相反..看看这个:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
                Log.i("", "Dispath event power");
                Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
                sendBroadcast(closeDialog);
                return true;
        }

        return super.dispatchKeyEvent(event);
}

它的作用:

每当用户按下电源按钮时。我们会在看到对话之前取消它!!:)。这对我有用…(在笔记本2上测试)

吴西岭
2023-03-14

唷。这是一个颇有争议的问题,背后有大量的评论。

首先,让我稍微改写一下你的问题。如果我理解清楚,您希望在活动期间禁用设备上的所有物理按钮。这包括电源按钮,您可以通过处理ACTION_SCREEN_OFF意图来检测它。对于此方案,您当前(成功的)解决方法是广播ACTION_SCREEN_ON,在屏幕关闭时将其踢回生机,前提是主机正确实现了此操作。

您现在希望加倍努力,使此操作变得不必要,当(并且仅当)您能够在将ACTION_SCREEN_OFF发送到系统之前捕获并处理它。这是否可能,如果是,如何?

这需要一些讨论。然而,简短的版本很简单:对于有限数量的设备,如果不对您的固件或Android操作系统的核心进行自定义修改,这是不可能的。

据记录,Android系统将此定义为广播操作。遵循消息传播的发布-订阅模式,此消息将通知所有相关方此操作。因为此消息是由系统发送的,因为消息堆栈由系统管理,并且因为消息也由系统接收,所以您的代码根本没有注入到正确的位置来阻止此消息的接收。

此外,对于某些设备,这将是一个没有任何程序中断的物理交换机。充其量,Android系统可以希望在事件发生时处理事件,这正是为什么广播消息在服务堆栈中是一种特殊情况。据我所知,基于此场景的稀疏文档,这就是为什么在我们考虑任何可能的滥用向量之前,它不是一个现成的、受支持的功能。

如果您有能力修改相关设备的物理硬件,那么您最好的方法实际上是更简单的方法:限制访问、损坏或禁用物理电源按钮。在许多情况下,这是不可取的,但这在您的Android设备被用作销售点或公共服务机器的情况下有效。如果这不可行,则只需要对电源按钮的访问设置物理限制,通过发送<code>ACTION_screen_on<code>来处理其余情况(例如,spot尝试切换屏幕)。

请记住,这种策略并非万无一失。请胜任并记录好该过程,以免成为下一次2600次暴露的素材。

祝您的应用程序好运。

 类似资料:
  • 问题内容: 如何在自己的应用程序中复制此功能? 我认为肯定有三种可能性… 捕获后退按钮的按下(如下所示),然后调用home按钮调用的任何方法。 捕获后退按钮按下,然后欺骗主页按钮。 捕获后退按钮的按下,然后启动主屏幕的活动,从而有效地将应用程序的活动置于停止状态。 编辑: 我知道有关服务,并且正在与此问题相关的应用程序中使用一种。该问题专门用于在按“后退”按钮时将活动置于停止状态而不是已破坏状态。

  • 我的对话框是扩展TitleArea对话框。在对话框上,我有一个关闭对话框按钮。它基本上只是调用方法关闭();当按钮被单击时。 我遇到的问题是,当用户单击窗口关闭(红色X)时,它调用的不是关闭方法。我认为这可能是调用Cancel方法。 检查returnCode,我看到当按下close时,它返回0。但当按下X时,返回1。 如何覆盖X键,只调用关闭方法,如按钮按下?

  • 问题内容: 我想如果用户按下主页按钮,我的服务将停止,这是我的代码,但对我不起作用,请帮助我: 谢谢 问题答案: 如果您试图确保该服务仅在相关活动可见时运行,则更好的解决方案是在用户正在运行的任何活动的onPause()方法中停止该服务。这样,当用户按下“返回”时和当用户按下“主页”时,将处理事件。 同样,您可以将服务绑定到一个或多个活动。当绑定到绑定服务的所有活动停止时,绑定服务将被销毁。

  • 我是新的Android和试图研发应用程序快速帮助。一旦用户双击电源按钮,我希望我的应用程序为两种情况直接呼叫救护车(屏幕打开/关闭)。我已经写了这段代码,但它不起作用。任何帮助将不胜感激。提前谢谢你。:) Android显示 我的电话服务。JAVA MyReceiver.java 主要活动。JAVA

  • 我现在用的是AppCompat。主题,但不希望按钮显示时标题全部大写,就像在v21设备上运行时一样。在V18或19上运行时,标题以我的字符串定义中定义的混合大小写显示,但在5.0上它们都是大写的。 一般来说,我可以通过使用没有任何特定继承的样式来设计按钮的样式——比如自定义背景图像。例如,下面是我的应用程序的主题定义: 以下是我应用于布局中的按钮小部件的典型样式: “capi0014 ze”项是我

  • 主要内容:本节引言:,1.StateListDrawable简介:,2.实现按钮的按下效果:,3.使用颜色值绘制圆角按钮,4.实现Material Design水波效果的Button,本节小结:本节引言: 今天给大家介绍的Android基本控件中的两个按钮控件,Button普通按钮和ImageButton图像按钮; 其实ImageButton和Button的用法基本类似,至于与图片相关的则和后面ImageView相同,所以本节 只对Button进行讲解,另外Button是TextView的子类,