1. 程式人生 > >安卓 ContentProvider

安卓 ContentProvider

標識符 str play set 特定 其他 targe result matcher

ContentProvider是暴露數據給另一個應用使用的組件。一般呢,我們大部分時候是利用ContentResovler獲取系統ContentProvider暴露的數據,比如:聯系人,圖片音頻視頻等文件,日歷等;所以這一次主要是記錄如何使用這些數據。

理解ContentProvider:

ContentProvider是不同應用程序之間進行數據交換的標準API,ContentProvider以某種Uri的形式對外提供數據,運行其他應用訪問或修改數據,即其他應用程序使用ContentResolver根據Uri去訪問操作指定數據, UriMatcher類用於幫助解析URI。

昨天研究了一下午的ContractsProvider,Android是將聯系人信息存儲在Sqlite數據庫中,對數據庫的操作讓我頭疼了一下午。

先列出最簡單的獲取聯系人名字電話郵箱的方法吧:

mContentResolver = getContentResolver();
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        Cursor cursor = mContentResolver.query(uri,null,null,null, null);//全是null,效率很低的,會獲取一大堆數據,cursor集,但是加了參數之後,不斷的入坑,至今未爬出來,容我緩緩
        while (cursor.moveToNext()){
            String cName 
= cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String cNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
       String cEmail = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.CommonDataKinds.Email.DATA));
Log.i(TAG,
"name: "+cName+";number:"+cNum); Log.i(TAG,"================="); } cursor.close();

Storage Acess Framwork,

DocumentProvider獲取圖片

1,打開圖庫的方式

 private void Opendocument(){
       // Log.i(TAG, "Opendocument111: ");
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent,null),2);
       // Log.i(TAG, "Opendocument: ");
    }

官方文檔上說,這個intent是用來“檢索一個特定類型的文件”並且回返回檢索到的文件的一個引用(文件的copy)

這個不受安卓系統的級別影響,而且也是大多數人選擇。

2獲取uri,

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Uri uri;
        if (requestCode==2&&resultCode== Activity.RESULT_OK){

            if (data!=null){
                uri = data.getData();
                Log.i(TAG, "onActivityResult: URI:"+uri);
                if (getBitmapFromUri(uri)!=null) {
                    mImageView.setImageBitmap(getBitmapFromUri(uri));
                }
            }
        }
    }

比較簡單,回調函數onActivityResult的data包含我們選擇的圖片的資源標識符。

3.通過圖片uri,獲取圖片到當前activity


private Bitmap getBitmapFromUri(Uri uri){
Bitmap image=null;
ContentResolver contentResolver = getContentResolver();
Cursor mCursor = contentResolver.query(uri,null,null,null,null);
while (mCursor.moveToNext()) {
String path = mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DATA));

image = BitmapFactory.decodeFile(path);
}
return image;
}
 
一定要寫這一步while (mCursor.moveToNext()),因為cursor的起始位置在-1;
不然該cursor內沒有所需的數據。


安卓 ContentProvider