android删除短信记录,android 4.4 以上删除短信的方法
android
4.4之后非默认的短信应用已经没有办法删除短信了。像以前那样用如下方法是不会没法删除短信的(即使在xml中配置了短信的读写权限),同时也不会有报错或其他提示。
但通过打印可以看到上述代码的result是等于0的,即没有删除掉短信。
这个是因为在:/frameworks/base/services/java/com/android/server/AppOpsService.java中android系统添加了权限检查的函数
检查用户设定权限的函数是:checkOperation() 和 noteOperation(),区别是
checkOperation() 只是检查 Operation 的情况,noteOperation()
还会记录访问时间等信息.
然后在MmsServiceBroker服务中可以找到如下代码就是对应用删除短信的权限进行检查
不过幸运的是在AppOpsService.java中也提供了修改权限的接口:修改某个 App 的某项权限的函数是
setMode(),其中就是修改成员变量 mUidOps。mUidOps 是一个List
保存了某个package对应的所有权限的mode (允许,忽略),
他的函数实现比较简单,重点是把控制转移到
AppOpsService 就可以了。例如 noteOperation() 和 setMode() 在 AppOpsManager
里面调用他们的函数是 noteOp() 和 setMode(),
OK,到这里我们应该就能有解决方法了,虽然接口没有公开,但我们在apk中利用反射来调用AppOpsManager,再利用setMode方法来给自己的应用打开权限,代码如下:
public final class SmsWriteOpUtil
{
private
static final int OP_WRITE_SMS = 15;
public
static boolean isWriteEnabled(Context context) {
int uid =
getUid(context);
Object opRes =
checkOp(context, OP_WRITE_SMS, uid);
if (opRes instanceof Integer)
{
return (Integer) opRes ==
AppOpsManager.MODE_ALLOWED;
}
return
false;
}
public
static boolean setWriteEnabled(Context context, boolean enabled)
{
int uid =
getUid(context);
int mode = enabled ?
AppOpsManager.MODE_ALLOWED
:
AppOpsManager.MODE_IGNORED;
return setMode(context,
OP_WRITE_SMS, uid, mode);
}
private
static Object checkOp(Context context, int code, int uid)
{
AppOpsManager appOpsManager =
(AppOpsManager) context
.getSystemService(Context.APP_OPS_SERVICE);
Class appOpsManagerClass =
appOpsManager.getClass();
try {
Class[] types = new Class[3];
types[0] = Integer.TYPE;
types[1] = Integer.TYPE;
types[2] = String.class;
Method checkOpMethod =
appOpsManagerClass.getMethod("checkOp",
types);
Object[] args = new Object[3];
args[0] =
Integer.valueOf(code);
args[1] =
Integer.valueOf(uid);
args[2] =
context.getPackageName();
Object result =
checkOpMethod.invoke(appOpsManager, args);
return result;
} catch
(NoSuchMethodException e) {
e.printStackTrace();
} catch
(InvocationTargetException e) {
e.printStackTrace();
} catch
(IllegalAccessException e) {
e.printStackTrace();
}
return
null;
}
private
static boolean setMode(Context context, int code, int uid, int
mode) {
AppOpsManager appOpsManager =
(AppOpsManager) context
.getSystemService(Context.APP_OPS_SERVICE);
Class appOpsManagerClass =
appOpsManager.getClass();
try {
Class[] types = new Class[4];
types[0] = Integer.TYPE;
types[1] = Integer.TYPE;
types[2] = String.class;
types[3] = Integer.TYPE;
Method setModeMethod =
appOpsManagerClass.getMethod("setMode",
types);
Object[] args = new Object[4];
args[0] =
Integer.valueOf(code);
args[1] =
Integer.valueOf(uid);
args[2] =
context.getPackageName();
args[3] =
Integer.valueOf(mode);
setModeMethod.invoke(appOpsManager,
args);
return true;
} catch
(NoSuchMethodException e) {
e.printStackTrace();
} catch
(InvocationTargetException e) {
e.printStackTrace();
} catch
(IllegalAccessException e) {
e.printStackTrace();
}
return
false;
}
private
static int getUid(Context context) {
try {
int uid =
context.getPackageManager().getApplicationInfo(
context.getPackageName(),
PackageManager.GET_SERVICES).uid;
return uid;
} catch
(PackageManager.NameNotFoundException e) {
e.printStackTrace();
return 0;
}
}
}
使用起起来也很方便:
if
(!SmsWriteOpUtil.isWriteEnabled(getApplicationContext()))
{
SmsWriteOpUtil.setWriteEnabled(
getApplicationContext(),
true);
}
deleteSMS();
短信权限:
<uses-permissionandroid:name="android.permission.READ_SMS" />
<uses-permissionandroid:name="android.permission.WRITE_SMS" />
android删除短信记录,android 4.4 以上删除短信的方法相关推荐
- 实例:建立一个触发器,当scott.emp被删除一条记录时,把被删除记录写到删除日志里面去
实例:建立一个触发器,当scott.emp被删除一条记录时,把被删除记录写到删除日志里面去. --创建一个存放删除记录的表,此表此时为空表 CREATE TABLE del_emp AS SELECT ...
- android获取手机短信记录,android 获取手机电话号码和短信内容
通过ContentResolver 获取到手机的联系人跟手机短信信息并显示出来. 1.实现的代码: package com.example.phone; import java.text.Simple ...
- android培训内容明细,记录Android开发学习
记录Android开发学习 Menu菜单学习 1.掌握Android中菜单的创建. 2.掌握Intent信使组件. 创建菜单Menu 我们模仿微信菜单栏学习,创建一个于微信菜单栏相似的菜单 那么我们应 ...
- android 紧急号码没记录,android – 当呼叫被隐瞒/未知时,来电号码是...
您可以阅读TelephonyRegistry的来源:Link /** - this class provides a centralized place that applications can r ...
- android微信分享工具,记录Android微信分享功能的吐槽与思考
在App内潜入分享到微信好友或朋友圈的功能想必大家已经屡见不鲜了,比如Android分享一个网页信息(URL)到微信客户端的代码: /** * 微信分享:分享网页 * @param context * ...
- android p获取通话记录_[android] 取得最近通话记录的方法
经过一下午的研究,终于弄明白了android中,关于通话记录取得的方法.下边是自己的一点心得. final Cursor cursor = cr.query(CallLog.Calls.CONTENT ...
- 如何删除百度搜索记录怎么删除
很多朋友在使用百度搜索关键词时,发现百度会记录之前搜索的关键词,这样当你再次搜索相同的关键词时,可以快速显示,方便用户搜索,这为用户使用百度搜索引擎搜索关键词提供了方便,但也带来了另外一个问题,就是可 ...
- 计算机联网记录能删除吗,电脑怎么删除路由器wifi记录
这个网络时代里面我们最常用来连接网络的设备就是路由器了,特别是在我们的生活中很难缺少wifi网络,当然我们有时候也可能会想要删除wifi网络,那么你知道电脑怎么删除路由器wifi记录吗?下面是学习啦小 ...
- android 手机误删短信恢复软件,误删除短信恢复大师 for android v4.1 安卓版 恢复Android手机上误删除的短信记录的软件...
误删除短信恢复大师是一款用户恢复Android手机上误删除的联系人信息.通话记录和短信记录的软件,用户恢复出来亦可以直接恢复到手机数据库中! 误删除短信恢复大师使用前提条件- 手机需要获取root权限 ...
最新文章
- 近段时间佛我就偶尔无
- Python统计学-006:描述统计-方差
- TEASOFT辅助服务程序UDPCopy 功能介绍
- JZOJ 5452. 【NOIP2017提高A组冲刺11.5】轰炸
- 一个测试员的工作与学习
- 实验四 恶意代码技术
- KindEditor js 路径修改及表单提交注意事项
- P1455-搭配购买【图论,并查集,dp,背包】
- vue中input多选_vue.js动态添加删除文本框input、下拉框select、单选radio、多选checkbox的方案。...
- 学硬件设计,需要看哪些书籍?
- Word文档格式的解码分析
- 搭建MYS-SAM9X5开发环境
- IT运维管理的服务内容包括哪些
- 一个快速的人脸检测库
- pixhawk飞控解锁方法
- PCI-7856运动控制卡
- Java算法大全,java进制装换,java日期转换
- 天然气气相色谱仪的软件性能分析
- ACCP S1 SQL第十一章上机练习
- 基于python-opencv和PIL的截取视频区域生成 GIF 动图