Я реализовал по этой ссылке, и у меня это сработало.
Вот ваше решение, создайте класс с именем PhotoProvider
, расширяющий ContentProvider, и автоматически реализует его методы.Объявите статическую конечную строку String, определяющую полномочия, и, наконец, реализовали статический метод, возвращающий наш новый Uri
.Вот целый класс ниже:
public class PhotoProvider extends ContentProvider {
public static final String CONTENT_PROVIDER_AUTHORITY = "com.example.magnificentapp.PhotoProvider";
@Override
public boolean onCreate() {
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
public static Uri getPhotoUri(File file) {
Uri outputUri = Uri.fromFile(file);
Uri.Builder builder = new Uri.Builder()
.authority(CONTENT_PROVIDER_AUTHORITY)
.scheme("file")
.path(outputUri.getPath())
.query(outputUri.getQuery())
.fragment(outputUri.getFragment());
return builder.build();
}
}
ContentProvider
полномочия принадлежат CONTENT_PROVIDER_AUTHORITY .
НЕ забывайте возвращать true в onCreate method.
Наконец, getPhotoUri(File file)
метод делает наш день.Вы передали свой объект File методу и получили Uri с fromFile(file)
, как я делал выше.Затем вы должны использовать Uri.Builder
и скопировать необходимые поля из нашего нелегального outputUri
, и, наконец, установить полномочия как CONTENT_PROVIDER_AUTHORITY .
Я на самом деле имитирую метод Uri.fromFile(file)
, за исключением установки пользовательскоговласть.Исходный метод подобен приведенному ниже в классе Uri:
public static Uri fromFile(File file) {
if (file == null) {
throw new NullPointerException("file");
}
PathPart path = PathPart.fromDecoded(file.getAbsolutePath());
return new HierarchicalUri(
"file", Part.EMPTY, path, Part.NULL, Part.NULL);
}
Этот метод устанавливает права доступа как Part.EMPTY, поэтому Android Oreo аварийно завершает работу, говоря, что он должен иметь неэкспортированный ContentProvider
, определяющий права доступа для всех Uris.
Установка полномочий устраняет проблему и помогает Android защитить ваши данные (в моем случае - фотографию) от утечки в вредоносные приложения .
НЕ забудьте добавить провайдера в AndroidManifest.xml :
<provider
android:name="com.example.magnificentapp.PhotoProvider"
android:authorities="com.example.magnificentapp.PhotoProvider"
android:exported="false"
android:grantUriPermissions="true" />
Наконец, вам нужно позвонить PhotoProvider.getPhotoUri(file)
вместо Uri.fromFile(file)
, как показано ниже:
outputUri = PhotoProvider.getPhotoUri(new File(activity.getCacheDir(), "cropped"));
ContentResolver cr = activity.getContentResolver();
cr.notifyChange(outputUri, null);
Попробуйте - HappyКодирование :) :) :)