Android四大組件分別為:1.活動(dòng)Activity患亿,2.服務(wù)Service,3.廣播接收器Broadcast Receiver咧欣,4.內(nèi)容提供器Content Provider
Content Provider內(nèi)容提供器概念完域、特點(diǎn)及用法分類(lèi)
①內(nèi)容提供器概念:
內(nèi)容提供器是用于在不同的app之間實(shí)現(xiàn)數(shù)據(jù)共享的組件赘来,它是android中實(shí)現(xiàn)跨程序共享數(shù)據(jù)的標(biāo)準(zhǔn)方式栏渺。
②內(nèi)容提供器特點(diǎn):
允許一個(gè)app訪(fǎng)問(wèn)另一app中的數(shù)據(jù)呛梆,在此基礎(chǔ)上還能保證被訪(fǎng)問(wèn)數(shù)據(jù)的安全性。
規(guī)避風(fēng)險(xiǎn)的做法是磕诊,內(nèi)容提供器可選擇性的針對(duì)部分?jǐn)?shù)據(jù)進(jìn)行共享填物。
③內(nèi)容提供器用法分類(lèi):
內(nèi)容提供器用法分類(lèi)分為兩種:
1.使用系統(tǒng)內(nèi)部的內(nèi)容提供器,讀取和操作數(shù)據(jù)霎终。
2.創(chuàng)建app本身的內(nèi)容提供器滞磺,為程序本身的數(shù)據(jù)提供外部訪(fǎng)問(wèn)接口。
系統(tǒng)內(nèi)部的內(nèi)容提供器莱褒,舉個(gè)栗子击困,在日常使用手機(jī)中的app時(shí),大家應(yīng)該都遇到過(guò)以下圖片中的場(chǎng)景广凸,有的第三方社交app想獲取讀取聯(lián)系人:
這其實(shí)就是系統(tǒng)內(nèi)部的內(nèi)容提供器在起作用阅茶,這是android系統(tǒng)內(nèi)部的電話(huà)簿內(nèi)容提供器,除此之外還有手機(jī)存儲(chǔ)炮障,短信目派,相冊(cè)坤候,日歷等都提供了類(lèi)似的外部訪(fǎng)問(wèn)接口胁赢。
使用系統(tǒng)內(nèi)部的內(nèi)容提供器——以讀取聯(lián)系人為例子
讀取聯(lián)系人(READ_CONTACTS)涉及用戶(hù)隱私,屬于危險(xiǎn)權(quán)限之一白筹,需要在AndroidManifest.xml中注冊(cè):
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
之后在代碼邏輯中使用運(yùn)行時(shí)權(quán)限申請(qǐng)的邏輯智末;
//運(yùn)行時(shí)權(quán)限的申請(qǐng),讀取聯(lián)系人的權(quán)限
//尚未授權(quán)
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS}, 1);
}
//已授權(quán)
else {
getContacts();
}
//運(yùn)行時(shí)權(quán)限,調(diào)用requestPermissions()方法會(huì)彈出申請(qǐng)權(quán)限選擇框徒河,兩個(gè)結(jié)果都會(huì)回調(diào)此方法
//授權(quán)結(jié)果封裝在grantResults中
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getContacts();
}
}
}
使用ContentResolver對(duì)象來(lái)訪(fǎng)問(wèn)內(nèi)容提供器中的共享數(shù)據(jù)系馆,并打印至日志中:
記得操作完之后,關(guān)閉cursor對(duì)象顽照,釋放資源
//獲取聯(lián)系人
private void getContacts() {
Cursor cursor=null;
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
//獲取姓名并用log打印
Log.d(TAG, "onCreate: " + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
//獲取手機(jī)號(hào)并用log打印
Log.d(TAG, "onCreate: " + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//關(guān)閉cursor
cursor.close();
}
}
請(qǐng)求授權(quán)如下:
允許后查看日志信息如下由蘑,成功獲取聯(lián)系人姓名和電話(huà)號(hào)碼: