当前位置: 首页 > news >正文

android9.0 amlogic 遥控器POWER按键的假待机的搭建

android9.0 amlogic 遥控器POWER按键的假待机的搭建

// 保留原有导入,新增必须的 IO 导入(如果没有的话)
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.File; // 路径校验用
import android.util.Log;
import android.os.SystemClock;
import android.content.Context;
import android.os.PowerManager;

// 日志标签和 avmute 路径常量(放在类内)
private static final String TAG = "PhoneWindowManager";
private static final String AVMUTE_PATH = "/sys/devices/virtual/amhdmitx/amhdmitx0/avmute";

/**
* 执行 shell 命令(显式使用 java.lang.Process,避免和 android.os.Process 冲突)
* @param command 要执行的 shell 命令
* @return true 执行成功,false 执行失败
*/
private boolean executeShellCommand(String command) {
// 关键:显式声明为 java.lang.Process,而非 android.os.Process
java.lang.Process process = null;
DataOutputStream dos = null;
try {
// 启动 sh 进程(系统层默认有权限)
process = Runtime.getRuntime().exec("sh");
dos = new DataOutputStream(process.getOutputStream());
// 写入命令并执行
dos.writeBytes(command + "\n");
dos.flush();
// 发送退出命令,等待执行完成
dos.writeBytes("exit\n");
dos.flush();
// 等待进程执行完毕,获取退出码
int exitCode = process.waitFor();
boolean success = (exitCode == 0);
if (!success) {
Log.e(TAG, "执行命令失败: " + command + ", 退出码: " + exitCode);
}
return success;
} catch (IOException | InterruptedException e) {
Log.e(TAG, "执行命令异常: " + command, e);
return false;
} finally {
// 关闭流和进程,避免内存泄漏
try {
if (dos != null) {
dos.close();
}
if (process != null) {
process.destroy();
}
} catch (IOException e) {
Log.w(TAG, "关闭进程流失败", e);
}
}
}

/**
* 写入 avmute 文件(封装具体业务逻辑)
* @param value 要写入的值(如 1/0)
* @return true 写入成功,false 失败
*/
private boolean setAvMuteValue(int value) {
// 先校验文件是否存在且可写,避免无效执行
File avMuteFile = new File(AVMUTE_PATH);
if (!avMuteFile.exists() || !avMuteFile.canWrite()) {
Log.e(TAG, "avmute 文件不存在或不可写: " + AVMUTE_PATH);
return false;
}
// 拼接命令:echo [value] > [路径]
String command = "echo " + value + " > " + AVMUTE_PATH;
return executeShellCommand(command);
}

/**
* 锁屏核心函数(集成 avmute 写入逻辑)
*/
private void lockScreen() {
try {
// 获取 PowerManager 实例(确保 mContext 已初始化)
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
if (powerManager != null && powerManager.isInteractive()) { // 屏幕亮着时才锁屏
// 1. 原有锁屏逻辑:熄灭屏幕
powerManager.goToSleep(SystemClock.uptimeMillis(),
PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);

// 2. 新增:写入 avmute 为 1
boolean avMuteSuccess = setAvMuteValue(1);
if (avMuteSuccess) {
Log.d(TAG, "锁屏时成功设置 avmute 为 1");
} else {
Log.w(TAG, "锁屏时设置 avmute 失败");
}
}
} catch (Exception e) {
Log.e(TAG, "锁屏逻辑执行失败", e);
}
}


// 可选:解锁时恢复 avmute 为 0
private void unlockScreen() {
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
if (powerManager != null && !powerManager.isInteractive()) {
// 原有解锁逻辑:唤醒屏幕
// powerManager.wakeUp(SystemClock.uptimeMillis(),
// 1, 0);
powerManager.wakeUp(SystemClock.uptimeMillis(), "android.policy:POWER");
// 恢复 avmute 为 0
setAvMuteValue(0);
Log.d(TAG, "解锁时设置 avmute 为 0");
}
}

========================

case KeyEvent.KEYCODE_POWER: {
// Any activity on the power button stops the accessibility shortcut
cancelPendingAccessibilityShortcutAction();
// result &= ~ACTION_PASS_TO_USER;
// isWakeKey = false; // wake-up will be handled separately
// if (down) {
// interceptPowerKeyDown(event, interactive);
// } else {
// interceptPowerKeyUp(event, interactive, canceled);
// }
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
if(down){
downTime = System.currentTimeMillis();
Log.d(TAG, "=======================downtime=" + downTime);
Log.d(TAG, "onKeyDown interceptKeyTq keycode=" + keyCode);
interceptPowerKeyDown(event, interactive); // 处理按下事件
}
else
{

upTime = System.currentTimeMillis();
long timeDelay = upTime - downTime;

Log.d(TAG, "====================uptime=" + upTime + "--------------" + timeDelay);
if(timeDelay > 1200){



if(mPowerManager.isScreenOn()) {
Message msg = mHandler.obtainMessage(MSG_POWER_SHUT_DOWN);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg,
ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
} else {
Log.e("GO to Wakeup--------> TTTEEE","keyCode :"+keyCode);
wakeUpFromPowerKey(event.getDownTime());
}
}


else
{

//interceptPowerKeyDown(event, interactive); // 处理按下事件

// interceptPowerKeyUp(event, interactive, canceled); // 处理抬起事件,包括灭屏事件
if (mPowerManager.isScreenOn()) {
// 屏幕亮着:执行锁屏逻辑(比如电源键短按)
lockScreen();
} else {
// 屏幕灭着:执行唤醒逻辑(比如电源键短按)
unlockScreen();
}
}
}

break;
}

http://www.jsqmd.com/news/392022/

相关文章:

  • 整理手机卡包别浪费!支付宝立减金这样处理更省心 - 可可收
  • 万爱通礼品卡如何回收?常见交易陷阱与解决方案揭晓! - 团团收购物卡回收
  • 2026虹口宠物医院口碑调查:哪些医院更受欢迎,猫咪体检/宠物医院/猫咪绝育/宠物内科/宠物外科,宠物医院排名前十 - 品牌推荐师
  • 09]delphi中richedit查找
  • 微信立减金回收简易流程:闲置福利不浪费,合规处理更省心 - 可可收
  • 2026年高性价比云服务器推荐|阿里云+腾讯云+雨云科技+凌霞软件专属福利,建站/开发必看
  • 小d和超级泡泡堂【牛客tracker 每日一题】
  • 携程任我行礼品卡回收攻略,闲置卡秒变现金流的秘密 - 京顺回收
  • 2026钢结构防火涂料优选指南:这些靠谱生产商值得关注,水性防火涂料,钢结构防火涂料直销厂家口碑推荐榜单 - 品牌推荐师
  • 深入解析:计算机毕业设计springboot健身房管理系统 基于SpringBoot的健身会所综合运营平台 面向Java的智能化健身场馆服务系统
  • 旋转位置编码笔记: R矩阵相乘推导
  • 2026年2月市面上口碑好的永磁工业风扇厂商推荐排行,大型工业风扇/工业吊扇/工业排风扇,永磁工业风扇品牌推荐排行 - 品牌推荐师
  • hadoop+Spark+django基于hadoop的电商商品推荐系统设计与实现
  • MATLAB 18自由度二级斜齿轮弯—扭—轴耦合(含驱动和负载)动力学代码(考虑时变啮合刚度、...
  • hadoop+Spark+django基于hadoop的交通信息分析系统设计与实现(源码+文档+调试+可视化大屏)
  • hadoop+Spark+django基于hadoop的电商用户数据行为分析与可视化(源码+文档+调试+可视化大屏)
  • hadoop+Spark+django基于大数据的汽车销售可视化系统的设计与实现(源码+文档+调试+可视化大屏)
  • hadoop+Spark+django基于hadoop的食物营养数据分析可视化系统(源码+文档+调试+可视化大屏)
  • 山东一卡通如何回收最划算?常见问题解答及实用技巧 - 团团收购物卡回收
  • Python3 基本数据类型详解
  • 别再花钱买云服务器了!OpenClaw 本地部署保姆级教程,10分钟拥有私人AI助手
  • 书籍-沙畹《西突厥史料》
  • 三相可控整流实战手记:从参数计算到仿真验证
  • 实测对比后!降AIGC软件 千笔·专业降AIGC智能体 VS WPS AI,专科生首选
  • 抓包工具tcpdump用法说明
  • 2026百联OK卡回收指南:快速、安全的交易方式有哪些? - 团团收购物卡回收
  • Effective Modern C++ 条款38:线程句柄析构行为与Vibe Coding优化指南
  • 本科生必看!标杆级的降AIGC工具 —— 千笔·专业降AI率智能体
  • 【金仓数据库】ksql 指南(七) —— 启动和管理事务(KingbaseES 数据一致性保障)
  • 图的接近中心性(closeness centrality)