2025-07-08

第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:writePermissionandroid:readPermission權限的優先級比android:permission的優先級高,隻要設置瞭高優先級的,那麼其他應用要使用高優先級的功能,就要聲明高優先級的權限。

例如,一個ContentProvider同時設置瞭android:readPermissionandroid: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上的數據發生變化,要觸發對調用者對通知。通知使用ContentResolvernotifyChange()方法觸發,

@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;
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *