有两种方法可以实现,安卓7.0版本系统自带,开发者选项里有一项不锁定屏幕充电时不休眠项
第一种方法
默认打开就可以frameworks/base/packages/SettingsProvider/res/values/default.xml下改成true
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java这里直接判断为1打开此功能
但此版本开发者模式关闭后,手动更改的选项也会还原成默认关闭状态。这种方法就必须的找到开发者模式下存值的位置修改成关闭开发者不会还原手动修改的值,具体修改位置应该在developmentsettings下。我没有用第一种方法,大家可以讨论一下怎么去改
但以上修改对10.0和11.0高版本有效,高版本的开发者模式是会记住你的选项不会还原
第二种方法
直接去判断充电的广播,让它插入usb时屏幕时间为永不超时,拔掉usb时屏幕默认5分钟
连接调试设备去抓log日志,系统有充电和断电的广播,给设备上电adb logcat
然后输入命令模拟断电adb shell dumpsys battery unplug再打印日志(adb shell dumpsys battery reset 设备还原正常充电,adb shell dumpsys battery 查看电池参数)
日志上可以找到改变电池状态时会收到android.intent.action.BATTERY_CHANGED(android.intent.action.ACTION_POWER_CONNECTED有的版本是这个广播)系统广播和断电时
android.intent.action.ACTION_POWER_DISCONNECTED系统广播
我们直接去判断者两个广播充电断电状态让其实现我们的功能
首先frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java下注册广播接收器
import com.android.systemui.usb.UsbStatusReceiver;
import android.content.IntentFilter;
public class SystemUIService extends Service {
//czq start
private UsbStatusReceiver mBroadcastReceiver;
//czq end
@Override
public void onCreate() {
super.onCreate();
((SystemUIApplication) getApplication()).startServicesIfNeeded();
//czq注册UsbStatusReceiver
mBroadcastReceiver = new UsbStatusReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.BATTERY_CHANGED");
registerReceiver(mBroadcastReceiver,intentFilter);
}
@Override
public void onDestroy() {
//销毁UsbStatusReceiver
if(mBroadcastReceiver != null){
unregisterReceiver(mBroadcastReceiver);
}
super.onDestroy();
}
//czq end
frameworks/base/packages/SystemUI/src/com/android/systemui/usb下新建一个UsbStatusReceiver.java直接copy
package com.android.systemui.usb;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import android.content.ComponentName;
import android.content.Intent;
import android.os.SystemProperties;
import android.provider.Settings;
import android.os.BatteryManager;
/**
* 用于接受usb插拔广播,控制屏幕休眠时间
*/
public class UsbStatusReceiver extends BroadcastReceiver {
private static final String TAG = "UsbStatusReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String action = intent.getAction();
Log.d(TAG, "onReceive: Status of usb has been changed");
//判断广播类型
if(action.equals("android.intent.action.BATTERY_CHANGED")) {
// 是否在充电
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
if(isCharging) {
Log.d(TAG, "IN THE CHARGING");
//usb连接状态屏幕永不休眠
Settings.System.putInt(context.getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,0);
}else{
//usb断开默认5分钟休眠
Log.d(TAG, "POWER DISCONNECTED");
Settings.System.putInt(context.getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,300000);
}
}
}
}
}
然后本地编译验证达到预期效果,不过这样的修改会导致系统自带的显示-休眠里的时间无法去定义,不充电的时候设置里手动修改成15秒,依旧会被上面300000这个值写死。可以灵活控制还得是第一种方法
Android获取电池充电状态的方式_007与狼共舞的博客-CSDN博客_android 获取电池状态
可以参考这个博主的思路和本文相差不大