覆盖电源按钮就像Home键覆盖电源按钮就像Home键(Override Power button j

2019-05-13 11:42发布

好吧,我做的,我想禁用该设备的所有硬按键的东西。

硬按键像电源,主页,音量增大,音量减小,搜索,返回。

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

所以,我只是想让你的人看到,并请您分享一些想法,使我获得可以用它了。

我得到的长按电源KeyEvent的onDispatchKeyEvent()以同样的方式,我想赶上相同的短按一下。 此外压迫力的时候我也试图通过让停止屏幕关闭 BroadcastSCREEN_OFF ,我成功地接受它,但我不能处理它。

谢谢。

然后,我已经创建了接收开/关广播画面的ReceiverScreen

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

DisableHardButton.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();
}
}

Answer 1:

唷。 这是一个相当争辩的问题,它的背后解说很大。

首先,我要改写你的问题有点。 如果我没有理解清楚,你想停用设备上的所有物理按键为您的活动的持续时间。 这是包括电源按钮,您可以通过处理检测ACTION_SCREEN_OFF意图。 您当前的(成功)的办法解决这个方案是广播一个ACTION_SCREEN_ON ,踢屏幕缓过劲来的时候它关闭,提供主机正确实现这一点。

现在,您想多走一英里,通过渲染这个动作是不必要的,如果(且仅当)你能捕捉和处理ACTION_SCREEN_OFF之前被发送到系统中。 这是可能的,如果是这样,怎么样?

这都有一些讨论。 简短的版本,但是,很简单: 这是不可能的,没有自定义修改你的固件或Android操作系统的核心,对于设备的数量有限。

Android系统,只要是记录,这定义为广播动作 。 继发布-订阅模式的消息传播,此消息会通知这一行动的所有相关方。 由于此消息是由系统发送,因为消息栈由系统管理,而且也因为由系统接收到的消息,你的代码根本不阻止此消息的接收正确的地方注射。

此外,对于某些设备,这将是没有任何编程中断任何的物理开关。 充其量,Android系统可能希望处理的事件,当它发生,这也正是为什么这个广播消息是在服务栈的一个特例东西。 据我所知,并基于此方案的稀疏文件,这就是为什么它不是一个彻头彻尾的现成,支持的功能,我们认为任何滥用的可能向量之前。

你最好的追索权实际上是一个更简单的一个,如果你有修改物理硬件有问题的设备的能力:限制访问,修改,增加或以其他方式禁用物理电源按钮。 在许多情况下,这是不可取的,但这个工程在你的Android设备正在使用,例如情况下,作为一个点销售或公共服务的机器。 如果这是不可行的,将物理上限制地接触到电源按钮可以是所有的需要,处理的情况外的剩余部分(例如,点尝试切换屏幕)通过发送ACTION_SCREEN_ON

只要记住,这种策略并非万无一失。 胜任做到这一点,文件的方法好,免得你成为下一个饲料2600揭露 。

祝您好运与您的应用程序。



Answer 2:

相反到所有问题的答案。检查了这一点:


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



Answer 3:

这是我做了什么:

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


Answer 4:

你可以了解一下电源按钮按下,但我不认为你会得到覆盖它,你将能够驳回关机对话框并显示别的东西。

以下是我已经尽力了,

package com.easylogs.app;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class CloseSystemDialogsIntentReceiver extends BroadcastReceiver {
    public void onReceive(final Context context, final Intent intent) {
        Log.i("HERE", "------------------------------------HERE");
        Toast.makeText(context, "OFFFFFFFFFFFFFFFF",Toast.LENGTH_LONG).show();
    }
}

和申报表现为,

    <receiver android:name="CloseSystemDialogsIntentReceiver">
    <intent-filter>
            <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>


Answer 5:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {

        return true;
    }

    return super.dispatchKeyEvent(event);
}

你试过上面的代码,我们可以处理电源键事件。 也看看这个LINK已处理的电源按钮按下事件。



Answer 6:

我知道为时已晚,但可能在今后其他的开发者有帮助。 经测试过的Androidñ。 从参考https://stackoverflow.com/a/15828592/1065357

 @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(!hasFocus) {
           Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialog);
        }
    }


文章来源: Override Power button just like Home button