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 以上删除短信的方法相关推荐

  1. 实例:建立一个触发器,当scott.emp被删除一条记录时,把被删除记录写到删除日志里面去

    实例:建立一个触发器,当scott.emp被删除一条记录时,把被删除记录写到删除日志里面去. --创建一个存放删除记录的表,此表此时为空表 CREATE TABLE del_emp AS SELECT ...

  2. android获取手机短信记录,android 获取手机电话号码和短信内容

    通过ContentResolver 获取到手机的联系人跟手机短信信息并显示出来. 1.实现的代码: package com.example.phone; import java.text.Simple ...

  3. android培训内容明细,记录Android开发学习

    记录Android开发学习 Menu菜单学习 1.掌握Android中菜单的创建. 2.掌握Intent信使组件. 创建菜单Menu 我们模仿微信菜单栏学习,创建一个于微信菜单栏相似的菜单 那么我们应 ...

  4. android 紧急号码没记录,android – 当呼叫被隐瞒/未知时,来电号码是...

    您可以阅读TelephonyRegistry的来源:Link /** - this class provides a centralized place that applications can r ...

  5. android微信分享工具,记录Android微信分享功能的吐槽与思考

    在App内潜入分享到微信好友或朋友圈的功能想必大家已经屡见不鲜了,比如Android分享一个网页信息(URL)到微信客户端的代码: /** * 微信分享:分享网页 * @param context * ...

  6. android p获取通话记录_[android] 取得最近通话记录的方法

    经过一下午的研究,终于弄明白了android中,关于通话记录取得的方法.下边是自己的一点心得. final Cursor cursor = cr.query(CallLog.Calls.CONTENT ...

  7. 如何删除百度搜索记录怎么删除

    很多朋友在使用百度搜索关键词时,发现百度会记录之前搜索的关键词,这样当你再次搜索相同的关键词时,可以快速显示,方便用户搜索,这为用户使用百度搜索引擎搜索关键词提供了方便,但也带来了另外一个问题,就是可 ...

  8. 计算机联网记录能删除吗,电脑怎么删除路由器wifi记录

    这个网络时代里面我们最常用来连接网络的设备就是路由器了,特别是在我们的生活中很难缺少wifi网络,当然我们有时候也可能会想要删除wifi网络,那么你知道电脑怎么删除路由器wifi记录吗?下面是学习啦小 ...

  9. android 手机误删短信恢复软件,误删除短信恢复大师 for android v4.1 安卓版 恢复Android手机上误删除的短信记录的软件...

    误删除短信恢复大师是一款用户恢复Android手机上误删除的联系人信息.通话记录和短信记录的软件,用户恢复出来亦可以直接恢复到手机数据库中! 误删除短信恢复大师使用前提条件- 手机需要获取root权限 ...

最新文章

  1. 近段时间佛我就偶尔无
  2. Python统计学-006:描述统计-方差
  3. TEASOFT辅助服务程序UDPCopy 功能介绍
  4. JZOJ 5452. 【NOIP2017提高A组冲刺11.5】轰炸
  5. 一个测试员的工作与学习
  6. 实验四 恶意代码技术
  7. KindEditor js 路径修改及表单提交注意事项
  8. P1455-搭配购买【图论,并查集,dp,背包】
  9. vue中input多选_vue.js动态添加删除文本框input、下拉框select、单选radio、多选checkbox的方案。...
  10. 学硬件设计,需要看哪些书籍?
  11. Word文档格式的解码分析
  12. 搭建MYS-SAM9X5开发环境
  13. IT运维管理的服务内容包括哪些
  14. 一个快速的人脸检测库
  15. pixhawk飞控解锁方法
  16. PCI-7856运动控制卡
  17. Java算法大全,java进制装换,java日期转换
  18. 天然气气相色谱仪的软件性能分析
  19. ACCP S1 SQL第十一章上机练习
  20. 基于python-opencv和PIL的截取视频区域生成 GIF 动图

热门文章

  1. C#课程设计 ——小游戏打地鼠
  2. Windows 10硬盘数据怎么永久擦除?
  3. IDEA2020.1中 maven 下载依赖Cannot resolve 错误解决方法
  4. 最全面的VPS主机常见问题及解答集锦
  5. Java注解——Repeatable
  6. go安装-window环境
  7. html5圆的中心点,HTML5 clearRect()清除圆形区域
  8. SSL虚拟专用网络通信分析
  9. 科技如何“再造”美妆行业,上海秉坤出席2022CBE美妆未来趋势高峰论坛
  10. 我觉的应该写工作日记了!