#java #android #imageview #android-contentprovider
Вопрос:
У меня есть папка ресурсов с изображениями в структуре моего проекта, и я отправляю их в другое приложение через контент-провайдера. Моя задача состоит в том, чтобы создавать файлы во время выполнения из просмотров изображений (поэтому я не могу поместить их в папку «Ресурсы» во время выполнения) и отправлять их поставщику контента.
Код поставщика контента:
...
@Nullable
@Override
public AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode) {
final int matchCode = MATCHER.match(uri);
if (matchCode == STICKERS_ASSET_CODE || matchCode == STICKER_PACK_TRAY_ICON_CODE) {
return getImageAsset(uri);
}
return null;
}
private AssetFileDescriptor getImageAsset(Uri uri) throws IllegalArgumentException {
AssetManager am = Objects.requireNonNull(getContext()).getAssets();
final List<String> pathSegments = uri.getPathSegments();
if (pathSegments.size() != 3) {
throw new IllegalArgumentException("path segments should be 3, uri is: " uri);
}
String fileName = pathSegments.get(pathSegments.size() - 1);
final String identifier = pathSegments.get(pathSegments.size() - 2);
if (TextUtils.isEmpty(identifier)) {
throw new IllegalArgumentException("identifier is empty, uri: " uri);
}
if (TextUtils.isEmpty(fileName)) {
throw new IllegalArgumentException("file name is empty, uri: " uri);
}
//making sure the file that is trying to be fetched is in the list of stickers.
for (StickerPack stickerPack : getStickerPackList()) {
if (identifier.equals(stickerPack.identifier)) {
if (fileName.equals(stickerPack.trayImageFile)) {
return fetchFile(uri, am, fileName, identifier);
} else {
for (Sticker sticker : stickerPack.getStickers()) {
if (fileName.equals(sticker.imageFileName)) {
return fetchFile(uri, am, fileName, identifier);
}
}
}
}
}
return null;
}
private AssetFileDescriptor fetchFile(@NonNull Uri uri, @NonNull AssetManager am, @NonNull String fileName, @NonNull String identifier) {
try {
return am.openFd(identifier "/" fileName);
} catch (IOException e) {
Log.e(Objects.requireNonNull(getContext()).getPackageName(), "IOException when getting asset file, uri:" uri, e);
return null;
}
}
...
Комментарии:
1. Запишите их в файл (например, в
getCacheDir()
) и используйтеFileProvider
для их обслуживания.2. Ваша самая большая проблема заключается в том, что нет никаких гарантий, что ваше приложение не будет использовать ресурсы, поэтому растровые изображения в памяти могут не сохраниться в памяти. Лучше всего записать его в файл, хотя вы можете сделать это, когда запрашивается URI, чтобы предотвратить ненужную запись файлов.