Управление локальными изображениями с постоянными данными - PullRequest
0 голосов
/ 19 мая 2018

Я изо всех сил пытаюсь понять, что может быть простым обходным путем для сопоставления изображений и постоянных объектов данных в Android.Более подробно, я разработал простую архитектуру персистентности комнаты, и теперь мне нужно добавить поле «изображение» к персистентному объекту java.Я пытался работать с URI, но мои знания об Android очень плохие, и что я получаю, так это то, что URI, который я восстанавливаю при выборе изображения с помощью файлового менеджера Android, действителен только до перезагрузки, поэтому, если я сохраню полученные данныеURI в базе данных, не будет иметь смысла, когда восстановится позже.Как мне управлять?

По сути, мне нужен простой способ связать объект с локальным изображением, хранящимся в телефоне (или снятым на лету с помощью камеры), не беспокоясь об удалении изображения пользователемили что-нибудь, просто простой способ.

Для истины я пытался повозиться с примером кода Google, но я явно потерпел неудачу, потому что я не знаю, что я делаю

private Bitmap getBitmapFromUri(Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return image;
    }

этокод приводит к ошибке компиляции, с обязательными: parcedDescriptor ... и VOID найдены, при вызове takePersistableUriPermission.Я даже не знаю, является ли это решением моей проблемы.

это код, который я использую для получения URI из локального изображения, но я также планирую позволить камере сделать снимок ипередать его для сохранения / связывания

// ACTION_OPEN_DOCUMENT is the intent to choose a file via the system's file
                // browser.
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);

                // Filter to only show results that can be "opened", such as a
                // file (as opposed to a list of contacts or timezones)
                intent.addCategory(Intent.CATEGORY_OPENABLE);

                // Filter to show only images, using the image MIME data type.
                // If one wanted to search for ogg vorbis files, the type would be "audio/ogg".
                // To search for all documents available via installed storage providers,
                // it would be "*/*".
                intent.setType("image/*");

                startActivityForResult(intent, READ_REQUEST_CODE);

1 Ответ

0 голосов
/ 19 мая 2018

URI, который я восстанавливаю при выборе изображения с помощью файлового менеджера Android, действителен только до перезагрузки, поэтому, если я сохраню полученный таким образом URI в базе данных, это не будет иметь смысла при восстановлении позже

Это не совсем точно.

A Uri, который вы вводите с помощью ACTION_OPEN_DOCUMENT, будет хорошо для любой активности, получаемой Uri через onActivityResult().Если вы передадите этот Uri другому компоненту, вы можете использовать FLAG_GRANT_READ_URI_PERMISSION, чтобы разрешить этому компоненту читать содержимое в этом Uri.Но как только ваш процесс заканчивается, ваш доступ к этому контенту прекращается.

Поскольку вы использовали ACTION_OPEN_DOCUMENT, вы можете использовать запрос takePersistableUriPermission(), чтобы иметь долгосрочный доступ к контенту, но это все еще работает, только еслисодержание все еще там.Если пользователь удалит контент или, возможно, даже переместит его, вы потеряете доступ.

Для истины я попытался повозиться с примером кода Google, но мне явно не удалось, потому что я не знаю, что яделаю

takePersistableUriPermission() не возвращает ParcelFileDescriptor.В противном случае этот конкретный вызов выглядит нормально.

Что касается загрузки изображения, , пожалуйста, используйте существующую библиотеку загрузки изображений (например, Glide, Picasso).

...