第5節 ContentProvider的使用權限
ContentProvider
可以被其他應用使用(就像一個公共網站,可以被任何人訪問);也可以被設置成隻被自己所在的應用使用(就像一個內部網站,隻能在公司內部訪問)。
這隻需要在應用的AndroidManifest.xml
文件中,給ContentProvider
設置上android:exported
屬性,
android:exported
屬性設置成true
:可被其他應用使用;
android:exported
屬性設置成false
:隻能被自己所在的應用使用;
在對其他應用開放ContentProvider
的時候,也可以設置上訪問權限,隻對部分應用開放使用的權限。
5.1 ContentProvider設置權限
在AndroidManifest.xml
文件中,對要設置權限的ContentProvider
設置上android:permission
屬性,該屬性值可以任意指定一個字符串。通常使用程序的包名作為其中的一部分,這樣可以避免和其他應用中的權限聲明沖突。例如"com.anddle.provideraccess
,
在AndroidManifest.xml
文件中,與同級的位置,對外聲明前面使用的標簽,表示這個應用發佈瞭一個叫做com.anddle.provideraccess
的權限,
其中android:name
屬性的值,就是標簽中設置的
android:permission
的值。
5.2 使用帶權限的ContentProvider
假如應用B要使用應用A中帶權限的ContentProvider
,需要在應用B的AndroidManifest.xml
中加入權限的使用,
其中,標簽中設置的
android:name
的值,就是應用A中對外聲明的那個provider
的權限值。
5.3 進一步的權限設置
應用A的ContentProvider
還可以將訪問的權限進一步細化,分成允許讀取和允許寫入兩種。
如果應用B隻需要讀取數據,就單獨申請讀取的權限;如果應用C隻需要寫入數據,就單獨申請寫入的權限;
聲明“隻能讀取”權限,
發佈“隻能讀取”權限,
聲明“隻能寫入”權限,
發佈“隻能寫入”權限,
需要註意的是,android:writePermission
與android:readPermission
權限的優先級比android:permission
的優先級高,隻要設置瞭高優先級的,那麼其他應用要使用高優先級的功能,就要聲明高優先級的權限。
例如,一個ContentProvider
同時設置瞭android:readPermission
和android:permission
權限,第三方應用如果隻請求瞭android:permission
權限,是沒有辦法進行讀取操作的。
/*******************************************************************/
* 版權聲明
* 本教程隻在CSDN和安豆網發佈,其他網站出現本教程均屬侵權。
/*******************************************************************/
第6節 ContentProvider的監聽
當ContentProvider
中存儲的數據內容發生變化時,是可以被關註瞭這些消息的查詢者監聽到的。
6.1 調用者監聽的方法
繼承ContentObserver
,創建監聽器類,
public class MyObserver extends ContentObserver {
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//添加變化的處理邏輯
}
}
註冊對指定Uri的監聽函數,一旦該Uri指向的內容發生改變,將通知到MyObserver
,
mContentObserver = new MyObserver(new Handler());
ContentResolver
cr = getContentResolver();
cr.registerContentObserver(MyContentProvider.CONTENT_BOOKS_URI, true, mContentObserver);
當程序退出或者不需要再監聽Uri的變化時,要主動取消對Uri的監聽,
ContentResolver
cr = getContentResolver();
cr.unregisterContentObserver(mContentObserver);
6.2 ContentProvider的配合
在ContentProvider
裡,每當特定Uri上的數據發生變化,要觸發對調用者對通知。通知使用ContentResolver
的notifyChange()
方法觸發,
@Override
public Uri insert(Uri uri, ContentValues values) {
Uri result = null;?
switch (sUriMatcher.match(uri)) {
case BOOKS: {
SQLiteDatabase db = mDBHelper.getWritableDatabase();
long id = db.insert(DBHelper.TABLE_NAME, null, values);
if(id > 0) {
result = ContentUris.withAppendedId(CONTENT_BOOKS_URI, id);
getContext().getContentResolver().notifyChange(uri, null);
}
}
break;
......
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}