内容提供者

来源:互联网 发布:淘宝网君子兰小苗价格 编辑:程序博客网 时间:2024/04/26 08:01

内容提供者

一、内容提供者是android 四大组件之一。

内容提供者包括三个部分:内容提供者(ContentProvider)、访问内容提供者(ContentResolver)、内容观察者(ContentObserver)

1.ContentProvider是不同应用程序之间进行数据交换的标准API,它以URI的形式对外提供数据,允许其他应用操作本应用数据。其他应用使用ContentResolver,并根据ContentProvider提供的URI操作制定数据。

2.ContentObserver是用来观察制定URI所代表的数据。当ContentObserver观察到指定的URI发生变化时,就会触发ContentObserver的onchange 方法。在此方法中使用ContentResolver就可以查询到变化的数据。

二、短信备份

1.布局文件

在住布局文件中添加一个Button按钮

<Button
    android:id="@+id/button"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="备份短信"
    android:onClick="click"
/>

 

2.Activity

public class MainActivityextends AppCompatActivity {

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

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void click(View view){
        
        //创建用来查询系统短信的 uri
        
Uri uri = Uri.parse("content://sms/");
        //获取 ContentResolver 对象
        
ContentResolver resolver = getContentResolver();
        //通过 ContentResolver 对象查询系统短信
        
Cursor cursor = resolver.query(uri,newString []{"address","date","type","body"},null,null,null,null);
        List<SmsInfo> smsInfoList = new ArrayList<>();
        while(cursor.moveToNext()){
            String address = cursor.getString(0);
            long date = cursor.getLong(1);
            int type = cursor.getInt(2);
            String body = cursor.getString(3);
            SmsInfo smsInfo = new SmsInfo(date,type,body,address);
            smsInfoList.add(smsInfo);
        }
        cursor.close();
        SmsUtils.backupSms(smsInfoList,this);
    }

}

 

3.SmsInfo方法

public class SmsInfo {
    private long date;
    private int type;
    private String body;
    private String address;
    private int id;

    public SmsInfo(){}

    public SmsInfo(longdate,int type,String body,String address,intid){
        this.date= date;
        this.body= body;
        this.address= address;
        this.id= id;
    }

    public SmsInfo(longdate,int type,String body,String address){
        this.date= date;
        this.body= body;
        this.address= address;
    }

    public long getDate() {
        return date;
    }

    public void setDate(longdate) {
        this.date= date;
    }

    public int getType() {
        return type;
    }

    public void setType(inttype) {
        this.type= type;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body= body;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address= address;
    }

    public int getId() {
        return id;
    }

    public void setId(intid) {
        this.id= id;
    }
}

 

4.工具类

public class SmsUtils {
    public static void backupSms(List<SmsInfo> smsinfos, Context context){

        try {
            XmlSerializer serializer = Xml.newSerializer();
            File file = new File(Environment.getExternalStorageDirectory(),"sms.xml");
            FileOutputStream os = new FileOutputStream(file);
            //初始化序列器号,指定 xml 数据写入到那个文件中,并指定文件的编码方式
            
serializer.setOutput(os,"utf-8");
            serializer.startDocument("utf-8",true);
            //创建根节点
            
serializer.startTag(null,"smss");
            for(SmsInfo info : smsinfos){
                //创建父节点开始标签
                
serializer.startTag(null,"sms");
                serializer.attribute(null,"id",info.getId()+"");
                //创建子节点body
                
serializer.startTag(null,"body");
                serializer.text(info.getBody());
                serializer.endTag(null,"body");
                //创建子节点 address
                
serializer.startTag(null,"address");
                serializer.text(info.getAddress());
                serializer.endTag(null,"address");
                //创建子节点 type
                
serializer.startTag(null,"type");
                serializer.text(info.getType()+"");
                serializer.endTag(null,"type");
                //创建子节点 date
                
serializer.startTag(null,"date");
                serializer.text(info.getDate()+"");
                serializer.endTag(null,"date");
                //父节点结束标签
                
serializer.endTag(null,"sms");
            }
            serializer.endTag(null,"smss");
            serializer.endDocument();
            os.close();
            Toast.makeText(context,"备份成功",Toast.LENGTH_SHORT).show();
            Log.d("SmsUtils","backupSms: "+file);
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(context,"备份失败",Toast.LENGTH_SHORT).show();
        }
    }
}

 

5.添加权限

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

 

 

三、短信接收器

重点看

1.布局文件:在住布局文件中添加一个TextView

<TextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="短信内容"
/>

2.MainActivity文件

public class Main2Activityextends AppCompatActivity {

    private TextView textView;
    @Override
    protected voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        textView = (TextView) findViewById(R.id.textview);
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://sms/");

        //注册内容观察者
        
resolver.registerContentObserver(uri,true,newMyObserve(new Handler()));
    }

    public class MyObserveextends ContentObserver{

        /**
         * Creates a content observer.
         *
         *
@paramhandler The handler to run {@link#onChange} on, or null if none.
         */
        
publicMyObserve(Handler handler) {
            super(handler);
        }

        //当内容观察者观察到数据库发生变化了,调用这个方法

        
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public voidonChange(boolean selfChange) {
            super.onChange(selfChange);
            Toast.makeText(Main2Activity.this,"数据库发生变化了", Toast.LENGTH_SHORT).show();
            Uri  uri = Uri.parse("content://sms/");
            //获取 contentresolver 对象
            
ContentResolver resolver = getContentResolver();
            //查询变化的数据
            
Cursor cursor = resolver.query(uri,newString [] {"address","date","type","body"},null,null,null,null);
            //获取最新的短信
            
cursor.moveToLast();
            String address = cursor.getString(0);
            String body = cursor.getString(3);

            //更改UI界面
            
textView.setText("短信内容"+body+"\n"+"短信地址"+address);
            cursor.close();
        }
    }
}

 

原创粉丝点击