本文主要是介绍关于android4.4及以上版本无法恢复还原短信的问题记录与解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先,在4.4以上和5.0以下可以利用权限管理功能(Application Operations)也就是来默认开启写短信的权限,但是坑爹的问题又来了,这个功能被谷歌给隐藏了,因此只能使用反射来搞定,具体做法如下:
一、检查写入短信权限是否已开启,因为有的国产手机,比如魅族,由于它们定制过系统,所以很有可能已经默认开启这个权限了。反射调用AppOpsManager类里的函数 int checkOp(int op, int uid, String packageName),其中op为15就是代表短信写入权限,代码如下:
@TargetApi(Build.VERSION_CODES.KITKAT)private int checkMode(){AppOpsManager appOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);Class c = appOps.getClass();try { Class[] cArg = new Class[3];cArg[0] = int.class;cArg[1] = int.class;cArg[2] = String.class;Method lMethod = c.getDeclaredMethod("checkOp", cArg);return (Integer) lMethod.invoke(appOps, 15, Binder.getCallingUid(), getPackageName());} catch(NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} return -1;}
二、上述checkMode()方法,返回 0 就代表有权限,1代表没有权限,-1代表函数出错了。此时如果返回0,表示没有开启,同样反射调用setMode函数,方法如下:
private boolean setMode(){AppOpsManager appOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);Class c = appOps.getClass();Class[] cArg = new Class[4];cArg[0] = int.class;cArg[1] = int.class;cArg[2] = String.class;cArg[3] = int.class;Method lMethod;try {lMethod = c.getDeclaredMethod("setMode", cArg);lMethod.invoke(appOps, 15, Binder.getCallingUid(), getPackageName(),AppOpsManager.MODE_ALLOWED);return true;} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return false;}
至此,在4.4以上以及5.0以下的就又可以愉快的恢复短信,写入短信到短信数据库了,细心的朋友可以注意到了,这个是5.0以下能用,没错,非常不幸,在5.0以上这种方法又行不通了(此刻内心早已经把谷歌祖宗八代都默默问候了下),没办法,继续折腾,最后发现在5.0以上只能通过弹框来让用户选择默认短信应用,临时的设置自己的应用为Default SMS app,临时获取一次写入短信数据库数据能力,等短信恢复完成再改回原来的应用为Default SMS app。,就是类似这种:
做法如下:
1、获取默认App的包名并保存。
String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);
2、让用户修改你的app为Default SMS app。
Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName()); startActivity(intent);
3、恢复完短信,再让用户修改回Default SMS app,使用第一步保存的包名。
Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp); startActivity(intent);
接下来,要将自己的应用设置为默认短信应用必须按照下面的步骤来,一样都不能少,不然成功不了,操作如下:
1、首先在清单文件里做如下配置(一个都不能少):
2、然后按照清单文件里的新建对应的类,类里面可以什么都不用写,如下图:
至此,写入短信到短信数据库,恢复短信的功能就完成了,有需要的人拿去吧!
这篇关于关于android4.4及以上版本无法恢复还原短信的问题记录与解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!