Android組件——ContentProvider

內容提供器(ContentProvider)主要用於在不同的應用程序之間實現數據共享的功能,它提供了一套完整的機制,允許一個程序訪問另一個程序中的數據,同時還能保證被訪問數據的安全性。當一個程序通過內容提供器對其數據提供了外部訪問接口,任何其他的應用程序就都可以對這部分數據進行訪問。Android系統中 自帶的電話簿、短信、媒體庫等程序都提供了類似的訪問接口,這就使得第三方應用程序可以充分地利用這部分數據來實現更好的功能。

對於每一個應用程序來說,如果想要訪問內容提供器中共享的數據,需要藉助ContentResolve類,可以通過Context中的getContentResolve()方法獲取到該類的實例。ContentResolve中的增刪改查與數據庫中基本類似,但是所有方法都不接受表名參數,而是使用一個Rri參數代替,這個參數的內容被稱爲內容URI。內容URI給內容提供器中的數據建立了唯一標示符,它主要由兩部分組成,權限(authority)和路徑(path)。權限是用於不同的應用程序作區分的,一般爲了避免衝突,都會採用程序包名的方式來進行命名。路徑則是用於對同一應用程序中不同的表作區分的,通常都會添加到權限的後邊。
可以調用Uri.parse()方法將內容URI字符串解析成Uri對象了

Uri uri=Uri.parse(“content://pathname/tablename”)

package com.example.administrator.mycontentprovide;

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button mButton_checkphone;
    private ContentResolver resolver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton_checkphone= (Button) findViewById(R.id.button_checkphone);
        mButton_checkphone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resolver=getContentResolver();
                //得到電話聯繫人這個應用的URI,是使用Uri.parse()方法解析出來的結果
                Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
                //查詢聯繫人
                //ContactsContract.CommonDataKinds.Phone.NUMBER是電話號碼的URI
                //ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME是聯繫人的URI
                Cursor cursor=resolver.query(uri,new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER,
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},null,null,null);
                cursor.moveToFirst();
                while(!cursor.isAfterLast()){
                    //得到聯繫人的姓名,其實也可以使用URI的方式來獲取
                    String []names=cursor.getColumnNames();
                    StringBuffer buffer=new StringBuffer();
                    //得到聯繫人的電話號碼
                    for (String name:names){
                        String value=cursor.getString(cursor.getColumnIndex(name));
                        buffer.append("字段名"+name+"  字段值"+value);
                    }
                    Log.d("聯繫人", ""+buffer);
                    cursor.moveToNext();
                }
            }
        });
    }

}

需要注意的是,訪問系統聯繫人是需要訪問權限的,所以再Manifest中添加一個權限聲明

<uses-permission android:name="android.permission.READ_CONTACTS"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章