内容提供者之获取短信

  Android中每个APP在数据存储上是隔离的,比如A应用想要访问B应用的数据库是无法直接访问。但是google提供了内容提供者的组件,内容提供者会对外暴露一些对本地数据的访问的接口。B应用如果实现了内容提供者接口并将该接口对外发布,则A应用则可以访问B中的某些数据了。

  这里以获取短信为例。

布局文件


布局文件很简单,通过button来触发click事件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
    <Button
        android:text="获取短信"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"/>
</LinearLayout>

Activity


在activity中主要使用ContentResolver对象,该对象是对内容提供者的访问接口。可以通过该对象与ContentProvider发生数据的交互

package xidian.dy.com.chujia;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;


public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void get(View v){
        ContentResolver cr = getContentResolver();
        //第一个参数是内容提供者的标识
        //系统有很多内容提供者,内容系统者如果想要被别人访问,则需要在清单文件中注册自己
        //sms是短息应用中提供者的标识,content是协议,就如同http一样
        Cursor cursor = cr.query(Uri.parse("content://sms"), new String[]{"address", "date","body", "type"}, null, null, null);
        if(cursor != null){
            while(cursor.moveToNext()){
                String address = cursor.getString(0);
                long date = cursor.getLong(1);
                String body = cursor.getString(2);
                int type = cursor.getInt(3);
                System.out.println(address + date + body + type);
            }
            cursor.close();
        }
    }

    public void insert(View v){
        ContentResolver cr = getContentResolver();
        ContentValues values = new ContentValues();
        values.put("address", 95555);
        values.put("type", 1);
        values.put("body", "收到100万");
        values.put("date", System.currentTimeMillis());
        cr.insert(Uri.parse("content://sms"),values);
    }
}

有内容提供者ContentProvider实现了query方法,这个查询才有结果,否则的话调用会返回null。

posted @ 2016-08-09 22:47  被罚站的树  阅读(958)  评论(0)    收藏  举报