android 模拟冻屏 代码实现
发布日期:2021-06-29 15:23:37
浏览次数:2
分类:技术文章
本文共 6608 字,大约阅读时间需要 22 分钟。
思路: 第一种方案:屏蔽除power外的其他按键,屏蔽状态栏下拉,屏蔽触屏。 代码如下: 需要系统签名: 添加权限: <uses-permission android:name="android.permission.STATUS_BAR" /> <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> package com.example.demo; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.util.Log; import android.view.Window; import android.view.WindowManager; import android.app.StatusBarManager; import android.view.MotionEvent; public class MainActivity extends Activity { public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; private StatusBarManager mStatusBarManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(FLAG_HOMEKEY_DISPATCHED); //禁止home disableStatusbar();// 禁止状态栏 setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. // getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return true; } private void disableStatusbar(){ // 第一句是否可以提出去 mStatusBarManager = (StatusBarManager) this.getSystemService(this.STATUS_BAR_SERVICE); mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_HOME: return true; default: break; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_HOME: return true; default: break; } return super.onKeyLongPress(keyCode, event); } @Override public void onBackPressed() { // TODO Auto-generated method stub // super.onBackPressed(); } } 如此下来,可以模拟除了power外的所有操作。 2: 以上行为,没法屏蔽power,下面方案实现屏蔽power 这里使用了am命令操作. 具体操作:进入cmd 输入adb shell进入终端 am hang 即可。 3:使用apk实现am命令方案: runCommand("am hang"); private boolean runCommand(String command) { java.lang.Process process = null; try { process = Runtime.getRuntime().exec(command); Log.i("lxm", "Runtime"); process.waitFor(); } catch (Exception e) { e.printStackTrace(); Log.i("lxm", "error"); return false; } finally { try { process.destroy(); } catch (Exception e) { } } Log.i("lxm", "finally"); return true; } 需要添加权限: <uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER" /> 具体代码可以查看activitymanagerserver.java 里面的hang函数。 4:完整apk源码为: AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.demo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.STATUS_BAR" /> <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> <uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/hello_world" android:screenOrientation="portrait" android:theme="@style/AppTheme" > <activity android:name="com.example.demo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> MainActivity.java package com.example.demo; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.util.Log; import android.view.Window; import android.view.WindowManager; import android.app.StatusBarManager; import android.view.MotionEvent; public class MainActivity extends Activity { public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; private StatusBarManager mStatusBarManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(FLAG_HOMEKEY_DISPATCHED); disableStatusbar(); setContentView(R.layout.activity_main); java.lang.Process process = null; runCommand("am hang"); } private boolean runCommand(String command) { java.lang.Process process = null; try { process = Runtime.getRuntime().exec(command); Log.i("lxm", "Runtime"); process.waitFor(); } catch (Exception e) { e.printStackTrace(); Log.i("lxm", "error"); return false; } finally { try { process.destroy(); } catch (Exception e) { } } Log.i("lxm", "finally"); return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. // getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return true; } private void disableStatusbar(){ // 第一句是否可以提出去 mStatusBarManager = (StatusBarManager) this.getSystemService(this.STATUS_BAR_SERVICE); mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_HOME: return true; default: break; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_HOME: return true; default: break; } return super.onKeyLongPress(keyCode, event); } @Override public void onBackPressed() { // TODO Auto-generated method stub // super.onBackPressed(); } } android.mk 为: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) #LOCAL_STATIC_JAVA_LIBRARIES := com.android.phone.common LOCAL_PACKAGE_NAME := Frozen LOCAL_CERTIFICATE := platform #LOCAL_PROGUARD_FLAG_FILES := proguard.flags include $(BUILD_PACKAGE) # Use the folloing include to make our test apk. include $(call all-makefiles-under,$(LOCAL_PATH))转载地址:https://codegg.blog.csdn.net/article/details/41482115 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月18日 08时54分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
零基础自学Python,你也可以实现经济独立!
2019-04-29
数字化转型的主干道上,华为云以“三大关键”成企业智能化推手
2019-04-29
数字化为何不走“捷”“径”?
2019-04-29
和总裁、专家交朋友,华为云助推政企智能化升级又做到前面去了
2019-04-29
BCOP章鱼船长,6月22日晚上8点上线薄饼
2019-04-29
为战疫助力,半导体功不可没
2019-04-29
了解这些操作,Python中99%的文件操作都将变得游刃有余!
2019-04-29
知道如何操作还不够!深入了解4大热门机器学习算法
2019-04-29
只有经历过,才能深刻理解的9个编程道理
2019-04-29
发现超能力:这些数据科学技能助你更高效专业
2019-04-29
AI当道,人工智能将如何改变金融业?
2019-04-29
消除性别成见,技术领域需要更多“乘风破浪的姐姐”
2019-04-29
7行代码击败整个金融业,这对20多岁的爱尔兰兄弟是如何做到的?
2019-04-29
2020十大编程博客:私藏的宝藏编程语言博客大放送!
2019-04-29
编程中的角色选择:哪类工作角色最适合你?
2019-04-29
10种算法一文打尽!基本图表算法的视觉化阐释
2019-04-29
未来属于人工智能工程师,但成功转型不容易
2019-04-29
科技界“挠头”:困扰科技界可持续发展的难题
2019-04-29
20年后,这5种编码语言可能就消失了……
2019-04-29