实现点击任务栏最右侧,相当于点击电池图标,即可一键熄屏。
需要root、安卓xposed框架,拦截 com.android.systemui 系统方法,监听点击状态栏事件。
熄屏功能则通过调用酷安下载的熄屏软件,通过其无障碍服务实现。
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* @CreateDate 2019/04/19 14:04.
* @Author QXTX-GOSPELL
*/
public class HookStatusBar implements IXposedHookLoadPackage {
boolean w = false;
float x = 0;
float y = 0;
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
// com.android.systemui
XposedHelpers.findAndHookMethod(View.class, "onTouchEvent", MotionEvent.class, new XC_MethodHook() {
protected void beforeHookedMethod(MethodHookParam param) {
final MotionEvent event = (MotionEvent) param.args[0];
final int t = event.getActionMasked();
if (t == MotionEvent.ACTION_MOVE) {
}
else if (t == MotionEvent.ACTION_DOWN) {
//View view = (View) param.thisObject;
//CMN.Log("onTouch!!! ACTION_DOWN", event.getRawX(), event.getRawY());
if (event.getRawY() <= 50 && event.getRawX() >= 650) {
x = event.getRawX();
y = event.getRawY();
w = true;
}
//CMN.recurseLogCascade(view);
param.setResult(true);
}
else if (w) {
w = false;
//CMN.Log("onTouch!!! ACTION_UP", event.getRawX(), event.getRawY(), t);
if (t==MotionEvent.ACTION_UP||t==MotionEvent.ACTION_CANCEL) {
if (event.getRawY() <= 50 && event.getRawX() >= 650) {
float dx = event.getRawX()-x, dy = event.getRawY()-y;
if (dx*dx+dy*dy <= 200) {
trunOffScreen(((View) param.thisObject).getContext());
//param.setResult(true);
}
}
}
}
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable { }
});
}
private void trunOffScreen(Context ctx) {
try {
ctx.startActivity(
ctx.getPackageManager().getLaunchIntentForPackage("xyz.maona.lockoo")
);
} catch (Exception e) {
CMN.Log(e);
}
}
}