安卓状态栏添加熄屏按钮,点击电池图标一键熄屏的方法。

662 阅读1分钟

实现点击任务栏最右侧,相当于点击电池图标,即可一键熄屏。

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