记录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权限后,写入短信操作的主要内容,如果未能解决你的问题,请参考以下文章

android权限permission大全

Android权限(permission)大全

Android权限(permission)大全

取消映射提升共享内存

weblogic安装错误记录

遇到FTP里面文件删不掉怎么办?