Android Contentprovider詳解

1. 什麼是內容提供者

內容提供者主要在不同的程序之間實現數據的共享,例如你自己做了一款app,但是需要獲取你的手機通訊錄的信息,這時候就需要內容提供者了,你也可以把自己APP的信息通過內容提供者,向外提供接口,供別的應用來獲取。

 

2. 使用ContentResolver 來獲取通訊錄信息

需要打開聯繫人權限READ_CONTACTS,並且動態申請權限。

通過Context.getContentResolver

private void readContact() {
    Cursor cursor = null;
    try {
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        if (cursor != null){
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                contactsList.add(name + "phone: " + phone);
            }
            adapter.notifyDataSetChanged();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

 

3. 創建自己的內容提供者

​public class MyProvider extends ContentProvider {

    private static final int BOOK_DIR = 0;
    private static final int BOOK_item = 1;
    private static UriMatcher sUriMatcher;
    private MyOpenhelper mMyOpenhelper;

    static {
         sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
         sUriMatcher.addURI("com.scy.android.contentprovidertest", "Book", BOOK_DIR);
         sUriMatcher.addURI("com.scy.android.contentprovidertest", "Book/#", BOOK_item);
    }

    @Override
    public boolean onCreate() {
        mMyOpenhelper = new MyOpenhelper(getContext());
        return true;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        SQLiteDatabase db = mMyOpenhelper.getReadableDatabase();
        Uri uriReturn = null;
        switch (sUriMatcher.match(uri)) {
            case BOOK_DIR:
            case BOOK_item:
                long newBookId = db.insert("Book", null, values);
                uriReturn = Uri.parse("content://com.scy.android.contentprovidertest/Book/" + newBookId);
                break;
            default:
                break;
        }
        return uriReturn;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        SQLiteDatabase db = mMyOpenhelper.getReadableDatabase();
        int deleteRow = 0;
        switch (sUriMatcher.match(uri)) {
            case BOOK_DIR:
                deleteRow = db.delete("Book",selection, selectionArgs);
                break;
            case BOOK_item:
                String bookId = uri.getPathSegments().get(1);
                deleteRow = db.delete("Book", "id=?", new String[]{bookId});
                break;
            default:
                break;
        }
        return deleteRow;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        SQLiteDatabase db = mMyOpenhelper.getReadableDatabase();
        Cursor cursor = null;
        switch (sUriMatcher.match(uri)) {
            case BOOK_DIR:
                cursor = db.query("Book", projection, selection, selectionArgs, null , null, sortOrder);
                break;
            case BOOK_item:
                String bookId = uri.getPathSegments().get(1);
                cursor = db.query("Book", projection, "id=?", new String[]{bookId},
                        null, null, sortOrder);
                break;
            default:
                break;
        }
        return cursor;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        SQLiteDatabase db = mMyOpenhelper.getReadableDatabase();
        int updateRows = 0;
        switch (sUriMatcher.match(uri)) {
            case BOOK_DIR:
                updateRows = db.update("Book", values, selection, selectionArgs);
                break;
            case BOOK_item:
                String bookId = uri.getPathSegments().get(1);
                updateRows = db.update("Book", values, "id=?", new String[]{bookId});
                break;
            default:
                break;
        }
        return updateRows;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        switch (sUriMatcher.match(uri)) {
            case BOOK_DIR:
                return "vnd.android.cursor.dir/vnd.com.scy.android.contentprovidertest.Book";
            case BOOK_item:
                return "vnd.android.cursor.item/vnd.com.scy.android.contentprovidertest.Book";
        }
        return null;
    }
}​

 

4. 動態權限申請

//將需要動態申請的權限暫存
​List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
        permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
    permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
        permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){
    permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
        permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
//請求權限
if (!permissionList.isEmpty()) {
    String[] permissions = permissionList.toArray(new String[permissionList.size()]);
    ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
}else {
    requestLocation();
}

//請求權限結果處理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch(requestCode) {
        case 1:
            if (grantResults.length > 0) {
                for(int result: grantResults) {
                    if (result != PackageManager.PERMISSION_GRANTED){
                        Toast.makeText(this, "必須同意所有權限", Toast.LENGTH_SHORT).show();
                        finish();
                        return;
                    }
                }
                requestLocation();
            } else {
                Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
                finish();
            }
            break;
        default :
    }
}​

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章