Могу ли я отправлять файлы, созданные из растровых изображений, а не файлы из папки «Ресурсы», через поставщика контента?

#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, чтобы предотвратить ненужную запись файлов.