1. 程式人生 > >Android8.0 適配ContentResolver解決java.lang.SecurityException: Failed to find provider null for user 0;

Android8.0 適配ContentResolver解決java.lang.SecurityException: Failed to find provider null for user 0;

對於沒有適配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);