记录remove掉WRITE_SMS权限后,写入短信操作
Posted xiaohuanqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录remove掉WRITE_SMS权限后,写入短信操作相关的知识,希望对你有一定的参考价值。
随着android系统的升级,Google对安全这一块是越发的看重,所以对于开发惹人员来说权限这一块就是一个不得不注意的内容,开发中会遇到很多关于动态权限管理的bug。
####记录remove掉WRITE_SMS权限后,写入短信
现在很多手机助手都会对短信进行备份和恢复,无奈再Android4.4以后就移除掉WRITE_SMS的权限了,那么要继续写入短信怎么办呢??
我发现QQ手机助手会弹窗让你设置该应用为短信应用,不然没法写入短信。
所以别再去尝试着寻找写入短信的权限了,没有了。QQ都妥协了,我们也跟着妥协把。
设置本应用为短信应用的两种方式:
利用反射,让用户没有感知的情况下设置(不推荐):
public static final String CLASS_SMS_MANAGER =
"com.android.internal.telephony.SmsApplication";
public static final String METHOD_SET_DEFAULT = "setDefaultApplication";
private void setDefaultSms(Boolean isMyApp)
try
Class<?> smsClass = Class.forName(CLASS_SMS_MANAGER);
Method method = smsClass.getMethod(METHOD_SET_DEFAULT, String.class, Context.class);
method.invoke(null, "要设置的包名", this);
catch (Exception e)
e.printStackTrace();
####利用系统的Intent,让用户自己选择(着重强调,推荐):
Manifest文件中声明:
<!-- BroadcastReceiver that listens for incoming SMS messages -->
<receiver android:name="com.unipeso.phone.smssetting.SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<!-- BroadcastReceiver that listens for incoming MMS messages -->
<receiver android:name="com.unipeso.phone.smssetting.MmsReceiver"
android:permission="android.permission.BROADCAST_WAP_PUSH">
<intent-filter>
<action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
<!-- Service that delivers messages from the phone "quick response" -->
<service android:name="com.unipeso.phone.smssetting.HeadlessSmsSendService"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</service>
SmsReceiver和MmsReceiver就是广播接收者,继承BroadcastReceiver并实现其onReceive方法就可以了,不需要做任何操作,HeadlessSmsSendService继承自Service 并实现其onBind方法即可不需要做任何操作。
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</activity>
再你需要设置的Activity中加入上面的Intent内容。
设置本应用为短信应用:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(getActivity());//获取手机当前设置的默认短信应用的包名
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
Intent smsIntent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, CashLendingApp.getAppPackageName());
startActivity(smsIntent);
ok,再你需要写入短信的时候,设置你应用为短信应用就可以获取到写入短信的权限。
但是,如果让用户修改系统本身的短信应用,估计会分分钟卸载你的app,所以考虑到用户体验,再备份或者你需要写入短信完成后,最好恢复默认的短信应用。
恢复默认的短信应用
//获取手机当前设置的默认短信应用的包名
String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(getActivity());
android 提供了这个API获取到默认短信应用包名,再完成你的操作后,将本应用的包名替换成系统默认短信应用的包名
Intent smsIntent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp );
startActivity(smsIntent);
以上是关于记录remove掉WRITE_SMS权限后,写入短信操作的主要内容,如果未能解决你的问题,请参考以下文章