android PowerManager亮灭屏(实现篇)
来源:互联网 发布:mac版酷狗怎么制作铃声 编辑:程序博客网 时间:2024/05/22 10:49
网上查了好多资料 不是讲原理就是讲原理呀! 你Tm到是实现呀!!!墨迹一大篇文章,都是看的官文档然后加上自己的理解一顿墨迹。
具体讲下我要实现的功能:
Android 6.0实现自动亮灭屏幕,按下电源键屏幕灭屏5s后自动亮屏,时间可以自己设置
用到的知识有 1:powermanger的基础知识
2:超级管理员权限 重中之重呀!!!!
参考超级管理员链接点击打开链接
3:Handler的基础知识
4:BroadcastReceiver的广播通知的基础知识
5:基础知识相信大家找网上一大堆
6:基础链接我就不给大家发了 相信你们比我找的好
据说4.0以后为了安全,谷歌兄做了很多安全设施。power电池管理就很难搞了,整了一周费劲巴力的弄了出来
废话不多说了直接上代码。 放心代码一定要全部。
首先是MainActivity 的代码
package com.example.unruly_zhao.powermanager_wakelock;import android.app.Activity;import android.app.KeyguardManager;import android.app.KeyguardManager.KeyguardLock;import android.app.admin.DevicePolicyManager;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.PowerManager;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener { private Button startBtn = null; private Button stopBtn = null; private EditText timeEditText = null; private EditText delayEditText = null; private TextView textviewResult = null; private TextView textviewVersion = null; /** * 设备管理 */ public DevicePolicyManager mDPM; /** * 次数 */ int time; /** * 延迟时间 */ int delay; /** * 计数 */ int timeCount; /** * 中间数 */ int timemid; /** * 组件 */ ComponentName devAdmReceiver; protected String tag = getClass().getSimpleName(); protected static final int REQUEST_ENABLE = 0; protected static final int GUI_DOING = 0; protected static final int GUI_FINISH = 1; private KeyguardManager km; private KeyguardLock kl; private PowerManager pm; private PowerManager.WakeLock wl; LockScreen lockScreen = new LockScreen(); int sucCount; int failCount; String versionName = "2016_10_14_WakeUp_1.0"; /** * handler deal with msg */ Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case GUI_DOING: Log.e(tag, "doing-->执行"); String string = (String) msg.obj; textviewResult.setText(string); textviewResult.setGravity(Gravity.CENTER); break; case GUI_FINISH: Log.e(tag, "doing-->完成"); String string1 = (String) msg.obj; textviewResult.setText(string1); textviewResult.setGravity(Gravity.CENTER); break; default: break; } } ; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); registerReceiver(mBatInfoReceiver, filter); Log.e(tag, "wake up oncreate"); init(); } private final BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); if(Intent.ACTION_SCREEN_ON.equals(action)){ Log.d("lyj", "-----------------screen is on..."); }else if(Intent.ACTION_SCREEN_OFF.equals(action)){ Log.d("lyj", "----------------- screen is off..."); handler.postDelayed(wakelockRunnable, 1000); } } }; /** * init初始化 */ private void init() {// TODO Auto-generated method stub this.startBtn = (Button) findViewById(R.id.button1); startBtn.setOnClickListener(this); this.stopBtn = (Button) findViewById(R.id.button2); stopBtn.setOnClickListener(this); stopBtn.setEnabled(false); this.timeEditText = (EditText) findViewById(R.id._time); timeEditText.setText("1"); timeEditText.setGravity(Gravity.CENTER); this.delayEditText = (EditText) findViewById(R.id.jiangeshuzi); delayEditText.setText("3"); delayEditText.setGravity(Gravity.CENTER); this.textviewResult = (TextView) findViewById(R.id.ttextviewResult); this.textviewVersion = (TextView) findViewById(R.id.textView2); textviewVersion.setTextColor(Color.RED);// textviewVersion.setText("2016-9-30_QKLabTestV1.0"); textviewVersion.setText(versionName); Log.e(tag, "wake up init"); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stub if (REQUEST_ENABLE == requestCode) { super.onActivityResult(requestCode, resultCode, data); } } /** * 唤醒 解锁 */ private void wakeAndUnlock(boolean b) { if (b) {// 获取电源管理器对象 pm = (PowerManager) getSystemService(Context.POWER_SERVICE);// 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");// 点亮屏幕 wl.acquire();// 得到键盘锁管理器对象 km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); kl = km.newKeyguardLock("unLock");// 解锁 kl.disableKeyguard(); sucCount++; } else {// 锁屏 kl.reenableKeyguard();// 释放wakeLock,关灯 wl.release();// failCount++; } } @Override public void onClick(View v) {// TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: String timeString = timeEditText.getText().toString(); String delayString = delayEditText.getText().toString(); Log.e(tag, "time-->" + timeString + ",delay--->" + delayString); sucCount = 0; failCount = 0; if (timeString.equals("") || (timeString.length() < 0)) { Toast.makeText(MainActivity.this, "请输入正确的次数", Toast.LENGTH_SHORT).show(); return; } else { startBtn.setEnabled(false); stopBtn.setEnabled(true); time = Integer.parseInt(timeString); delay = Integer.parseInt(delayString); Log.e(tag, "time-->" + time + ",delay--->" + delay); timeCount = time; handler.postDelayed(wakelockRunnable, 1000); } break; case R.id.button2: handler.removeCallbacks(wakelockRunnable); startBtn.setEnabled(true); stopBtn.setEnabled(false); Log.e(tag, "stopbutton点击停止"); break; default: break; } } Runnable wakelockRunnable = new Runnable() { @Override public void run() {// TODO Auto-generated method stub ScreenLock(); startBtn.setEnabled(false); stopBtn.setEnabled(true); timemid = time - 1; time = timemid; if (time > 0) { // 不是执行一次 startBtn.setEnabled(false); stopBtn.setEnabled(true); handler.removeCallbacks(wakelockRunnable); Log.e(tag, "time >0 >>>>执行次数:" + timeCount + ";当前执行:" + timemid + "\n成功次数:" + sucCount + ";失败次数:" + failCount); String string = "执行次数:" + timeCount + ";当前执行:" + timemid + "\n成功次数:" + sucCount + ";失败次数:" + failCount; int msgwhat = GUI_DOING; sendmsg(msgwhat, string); handler.postDelayed(wakelockRunnable, 2000); } else {// 一次执行完成 startBtn.setEnabled(true); stopBtn.setEnabled(false);//send mesg Log.e(tag, "time <0 >>>>执行次数:" + timeCount + ";当前执行:" + timemid + "\n成功次数:" + sucCount + ";失败次数:" + failCount); String string = "执行次数:" + timeCount + ";当前执行:" + timemid + "\n成功次数:" + sucCount + ";失败次数:" + failCount; int msgwhat = GUI_FINISH; sendmsg(msgwhat, string); handler.removeCallbacks(wakelockRunnable); } } }; @Override protected void onDestroy() {// TODO Auto-generated method stub super.onDestroy(); handler.removeCallbacks(wakelockRunnable); MainActivity.this.finish(); Log.e(tag, "finish"); } protected void sendmsg(int meswhat, String string) {// TODO Auto-generated method stub Message msg = new Message(); msg.what = GUI_FINISH; msg.obj = string; handler.sendMessage(msg); Log.e(tag, "send message"); } @Override protected void onPause() {// TODO Auto-generated method stub super.onPause(); } @Override protected void onResume() {// TODO Auto-generated method stub super.onResume(); } private void ScreenLock() {// TODO Auto-generated method stub devAdmReceiver = new ComponentName(MainActivity.this, Darclass.class); mDPM = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); if (!mDPM.isAdminActive(devAdmReceiver)) { Intent intent = new Intent( DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, devAdmReceiver); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "设备管理涉及的管理权限,下面是清单,一次性激活!"); Log.e(tag, "添加设备权限"); startActivityForResult(intent, REQUEST_ENABLE); } else { mDPM.lockNow(); long locknow = System.currentTimeMillis(); Log.e(tag, "locknow---syscurrenttime>>>" + locknow); try { Thread.sleep(delay * 1000L); Log.e(tag, " 延迟" + delay + "s后亮屏"); } catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); } Log.e(tag, "wakeandunlock"); wakeAndUnlock(true); Log.e(tag, "wakeandunlock---间隔时间>>>" + (System.currentTimeMillis() - locknow)); } }}
首先创建一个空的接收者起名为Darlass
package com.example.unruly_zhao.powermanager_wakelock;import android.app.admin.DeviceAdminReceiver;import android.app.admin.DevicePolicyManager;import android.content.ComponentName;import android.content.Context;import android.util.Log;/** * Created by Unruly_Zhao on 2017/9/16. */public class Darclass extends DeviceAdminReceiver { @Override public DevicePolicyManager getManager(Context context) { Log.i("XiaoMaGuo", "调用了getManager()方法"); return super.getManager(context); } @Override public ComponentName getWho(Context context) { Log.i("XiaoMaGuo", "调用了getWho()方法"); return super.getWho(context); }}
创建一个广播接收器LockScreen
package com.example.unruly_zhao.powermanager_wakelock;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;/** * Created by Unruly_Zhao on 2017/9/16. */public class LockScreen extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { }}Layout xml 布局 activity_main
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.unruly_zhao.powermanager_wakelock.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 次数:" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="number" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/_jiange" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 间隔:" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/jiangeshuzi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:inputType="number" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/button1" android:layout_marginTop="30dp" android:text=" 停止 " /> <TextView android:id="@+id/ttextviewResult" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="71dp" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 开始 " android:layout_centerVertical="true" android:layout_centerHorizontal="true"/> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/button2" android:layout_marginTop="14dp" android:text="使用说明:第一次使用请点击开始,激活设备." android:textAppearance="?android:attr/textAppearanceMedium" /> </RelativeLayout></LinearLayout>
创建一个xml文件不会的可以查下资料如何创建
在res/xml下新建一个xml文件,填入如下代码(需要什么功能填什么功能,<force-lock />这个是,不用全写)想要深入理解的可以都查查其他的
powermanager.xml
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <force-lock /> </uses-policies></device-admin>
清单文件所加的权限和配置
第二个回报红色 alt+Enter 解决掉它 很多博客都写可能需要第二个 我可以明确告诉你第二个不在绝对实现不了
他们那个可能版低 ,反正我是没实现
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DEVICE_POWER" />
最后在清单文件中不要忘记这两个接收器实现下
这是我的名字改成自己的
<receiver android:name=".LockScreen"></receiver> <receiver android:name=".Darclass" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/powermanager"/> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> </intent-filter> </receiver>
阅读全文
1 0
- android PowerManager亮灭屏(实现篇)
- Android 锁屏(PowerManager)
- android powermanager
- android PowerManager 详细分析(一)
- android PowerManager分析(非常详细)
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- Android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- android的PowerManager和PowerManager.WakeLock
- Nginx的启动、停止与重启
- tensorflow的局部最小值
- Python sh模块--------替换subprocess的利器
- java NIO中ServerSocketChannel和SocketChannel连接的过程
- 点黑js
- android PowerManager亮灭屏(实现篇)
- 前端涉及框架体系
- 频道管理
- GTK 中多国语言
- String,StringBuffer和StringBuilder
- 自定义气泡文字背景遇到的上下边距比较宽的问题
- Ubuntu系统如何修改环境变量
- GitLab 服务器下客户端TortoiseGit配置和使用教程
- MySQL的常用SQL语句