Android8.0 適配ContentResolver解決java.lang.SecurityException: Failed to find provider null for user 0;
阿新 • • 發佈:2018-12-14
對於沒有適配Android8.0+的裝置在使用ContenResolver時會出現java.lang.SecurityException: Failed to find provider null for user 0; expected to find a valid ContentProvider for this authority的異常.
原因是在8.0以後,需要使用一個定義的應用內的ContentProvider來防止來自惡意應用的內容變更,以及私密資料洩露.
適配方法:
1.新建一個XXContentProvider繼承自ContentProvider
2.在AndroidManifest.xml中宣告該provider,並指定authority
3.在使用notifyChange和registerContentObserver時,需要將此前的Uri加上authority
如下:
<provider
android:authorities="Demo"
android:name=".dao.offline.DbContentProvider"
android:enabled="true"
android:exported="false"/>
public class DbContentProvider extends ContentProvider { private static final String AUTHORITY = "Demo"; private static final String SCHEME = "content"; @Override public boolean onCreate() { return true; } public static Uri getUri(String dbName) { return new Uri.Builder().authority(AUTHORITY) .path(AppConstant.getDBPath() + File.separator + dbName) .scheme(SCHEME) .build(); } }
使用:
context.getContentResolver().registerContentObserver(
DbContentProvider.getUri("YouDbName"), true, mDBObserver);