您的位置:首页 > 移动开发 > Android开发

Android 使用内容解析者往短信数据库里插入一条数据

2017-04-29 12:39 621 查看


public class MainActivity extends AppCompatActivity {

    private String defaultSmsPkg;
    private String mySmsPkg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取默认App包名并保存
        defaultSmsPkg = Telephony.Sms.getDefaultSmsPackage(this);
        mySmsPkg = this.getPackageName();
        if (!defaultSmsPkg.equals(mySmsPkg)) {
            //            如果这个App不是默认的Sms App,则修改成默认的SMS APP
            //            因为从Android 4.4开始,只有默认的SMS APP才能对SMS数据库进行处理
            Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, mySmsPkg);
            startActivity(intent);
        }
    }

    // 点击按钮 往短信数据库里面插入一条数据
    public void click1(View v) {

        // 由于短信数据库已经通过内容提供者暴露出来了 所以我们可以直接通过内容解析者操作数据库
        Uri uri = Uri.parse("content://sms/inbox");
        ContentValues values = new ContentValues();
        values.put("address", "110");
        values.put("body", "王先生,请您马上来一趟,否则后果自负");
        values.put("date", System.currentTimeMillis());
        getContentResolver().insert(uri, values);

        Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
        intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsPkg);
        startActivity(intent);
    }
}

然后按照清单文件里的新建对应的类,类里面可以什么都不用写

<receiver
android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<receiver
android:name=".MmsReceiver"
android:enabled="true"
android:exported="true"
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>

<activity android:name=".SmsActivity">
<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>

<service
android:name=".SmsService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE">
<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>


以上为5.0以上系统写短信方式。

但是在同一个click里调用两次更改默认短信方式(改为app再改回message)会出一些无响应的问题,待解决。

Android4.4之前,可以直接申请权限来解决读写短信问题

<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />


在Android4.4之后,但是在4.4以上以及5.1由于系统更新了 SMS 的部分API,加强了权限控制,因此现在只有default SMS app才能对短信数据库有写权限,但是用户可以把第三方应用设置为default SMS app。也就是说非default SMS app也能读写短信,只不过是不能写入短信数据库中,这也就直接导致在4.4以上短信无法恢复。

4.4-5.0写短信方式看我上一篇博文。

  

   

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐