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 :
}
}