訪問內容提供者

訪問內容提供者,可以獲取很多其他應用的信息,比如短信,下面就用備份短信的案例

備份短信需要在AndroidMainfest.xml中添加權限:

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

一個是讀短信權限,一個是寫外部存儲權限
備份短信的時候涉及到了XML序列化的問題,還有獲取一個遊標訪問短信數據庫,在此不過多贅述,直接附上代碼:

MainActivity:

public class MainActivity extends AppCompatActivity {

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

    public void click(View view){
        //設定訪問短信的Uri
        Uri uri = Uri.parse("content://sms/");
        ContentResolver resolver = getContentResolver();
        //獲取Resolver並且通過這個對象查詢短信,獲取數據庫的一個遊標
        Cursor cursor = resolver.query(uri,new String[] {"address","date","type","body"},null,null,null);
        //創建一個list來保存備份的短信數據
        List<SmsInfo> smsInfoList = new ArrayList<>();
        //創建一個循環保存短信數據;
        if (cursor != null) {
            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);
    }
}

SMSInfo工具類:保存短信信息

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

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

    public long getDate() {
        return date;
    }

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

    public int getType() {
        return type;
    }

    public void setType(int type) {
        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(int id) {
        this.id = id;
    }
}

SmsUtils工具類:序列化短信信息

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);
            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() + "");

                serializer.startTag(null, "body");
                serializer.text(info.getBody());
                serializer.endTag(null, "body");

                serializer.startTag(null, "address");
                serializer.text(info.getAddress());
                serializer.endTag(null, "address");

                serializer.startTag(null, "type");
                serializer.text(info.getType() + "");
                serializer.endTag(null, "type");

                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_LONG).show();


            } catch (IOException e1) {
                e1.printStackTrace();
                Toast.makeText(context,"備份失敗",Toast.LENGTH_LONG).show();
        }
    }

    }
發佈了27 篇原創文章 · 獲贊 30 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章