ContentProvider是Android實(shí)現(xiàn)跨程序共享數(shù)據(jù)的標(biāo)準(zhǔn)方式。
主要用于,一個(gè)程序訪(fǎng)問(wèn)另一個(gè)程序中允許共享的數(shù)據(jù),同時(shí)還能保證被訪(fǎng)問(wèn)數(shù)據(jù)的安全性。
ContentProvider基本用法
1. ContentResolver
如果想訪(fǎng)問(wèn)ContentProvider中共享的數(shù)據(jù),就需要借助ContentResolver類(lèi)。
通過(guò)Context提供的getContentResolver()獲取,ContentResolver提供了一系列的CRUD操作。
內(nèi)容Uri
ContentResolver的CRUD不接收表名參數(shù),而是用一個(gè)Uri代替。
組成:
authority:用于區(qū)分不同的應(yīng)用程序,一般用程序包名命名。
path:用于對(duì)同一程序不同表做區(qū)分,通常添加到authority后。
程序A定義ContentProvider,共享數(shù)據(jù)。
1. 定義數(shù)據(jù)庫(kù)
public class UserDb extends SQLiteOpenHelper {
public UserDb(Context context) {
super(context, "user.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table if not exists " +
"t_user(_id integer primary key autoincrement," +
"name text," +
"code integer)");
sqLiteDatabase.execSQL("insert into t_user(name,code)" +
"values('Demo1',1),('Demo2',2) ");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
2. 定義Provider共享數(shù)據(jù)
public class MyProviderDemo extends ContentProvider {
private static final String TAG = "MyProviderDemo";
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static int URI_MATCHER_SUCCESS = 0;
private UserDb mUserDb;
static {
/**
* 參數(shù)注意
* authority 要和配置清單中一致
* path 內(nèi)容解析者調(diào)用的路徑 com.w.review/query
* code 匹配成功的返回碼
*/
URI_MATCHER.addURI("com.w.review", "query", URI_MATCHER_SUCCESS);
}
@Override
public boolean onCreate() {
mUserDb = new UserDb(getContext());
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri,
@Nullable String[] projection,
@Nullable String selection,
@Nullable String[] selectionArgs,
@Nullable String sortOrder) {
int code = URI_MATCHER.match(uri); //別的程序調(diào)用,匹配時(shí)查詢(xún)成功時(shí)返回
if (code == URI_MATCHER_SUCCESS) {
SQLiteDatabase database = mUserDb.getReadableDatabase();
Cursor cursor = database.query("t_user", projection,
selection, selectionArgs,
null, null, sortOrder);
return cursor;
} else {
Log.i(TAG, "參數(shù)異常" + code);
throw new IllegalArgumentException("參數(shù)異常");
}
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri,
@Nullable ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri,
@Nullable String selection,
@Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri,
@Nullable ContentValues values,
@Nullable String selection,
@Nullable String[] selectionArgs) {
return 0;
}
}
3. mainfests內(nèi)聲明
<application>
<provider
android:name=".provider.MyProviderDemo"
android:authorities="com.w.review"
android:enabled="true"
android:exported="true">
</provider>
</application>
程序B查詢(xún)A的共享數(shù)據(jù)
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getProviderData();
}
private void getProviderData() {
//注意:規(guī)定一定要跟頭路徑content://
Uri uri = Uri.parse("content://com.w.review/query");
Cursor cursor = getContentResolver().query(uri, new String[]{"name"},
null, null, null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String value = cursor.getString(0);
Log.i(TAG, value);
}
cursor.close();
} else {
Log.i(TAG, "fail");
}
}
}
獲取手機(jī)聯(lián)系人
權(quán)限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getPermission();
}
//6.0后需要?jiǎng)討B(tài)申請(qǐng)權(quán)限
private void getPermission() {
int checkPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_CONTACTS}, 0);
} else {
getLinkMan();
}
}
private void getLinkMan() {
Cursor 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 number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.i("TAG", name + "\r\n" + number);
}
cursor.close();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 0:
if (grantResults.length > 0 && grantResults[0] == PackageManager.GET_RECEIVERS) {
getLinkMan();
} else {
Toast.makeText(MainActivity.this, "沒(méi)有讀取權(quán)限", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}