#android-fragments #android-permissions #picasso #android-architecture-navigation #user-permissions
Вопрос:
Мое приложение использует компонент навигации и, таким образом, выполняет одно действие с несколькими фрагментами.
- В фрагменте учетных записей я разрешаю пользователю создать новую учетную запись с помощью fab, которая затем отображает диалог. Внутри диалога пользователь может щелкнуть значок аватара, который должен открыть средство выбора системы. Ниже приведен код onClick (для выбора изображения аватара):
если (ContextCompat.checkSelfPermission( requireContext(), Манифест.разрешение.READ_EXTERNAL_STORAGE) == Менеджер пакетов.PERMISSION_GRANTED) { //ОТСЮДА ВЫ МОЖЕТЕ ПРОЧИТАТЬ ИХ ДАННЫЕ.
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult.launch(intent);}
Приведенный выше код затем открывает средство выбора, и я выбираю изображение (я также обработал запрос разрешения, если оно не предоставлено).
В разделе о результатах деятельности мой код выглядит следующим образом:
if (result.getResultCode() == Activity.RESULT_OK) {
Intent data = result.getData();
Uri contentUri = data.getData();
System.out.println("the returned uri is " contentUri);
final int takeFlags = intent.getFlags()
amp; (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
requireActivity().getContentResolver().takePersistableUriPermission(contentUri, takeFlags);
subscriberImageUri = uri.toString(); // this is a string i store in my sqlite db.
Picasso.get().load(contentUri).into(subscribersImage);
}
Проблемы:
- Изображение отображается только в диалоге, а не в списке учетных записей, который фрагмент использует в качестве макета. Вот как я устанавливаю изображение после того, как пользователь нажимает кнопку создать учетную запись:
newSubscriber.setSubscriberImageURi(subscriberImageUri); subscribersArrayList.add(подписчик новостей); subscribersAdapter.notifyDataSetChanged();
Piccasso просто не загружает изображение (код находится в адаптере recycler) и не выдает ошибку.
- После сохранения URI и сохранения его строки в sqlite, как я могу заставить строку по-прежнему указывать на то же изображение, которое было выбрано? Это мой код во фрагменте сведений об учетной записи (который должен отображать изображение профиля, выбранное во фрагменте списка учетных записей:
Список uriPermissions = requireActivity().getContentResolver().getPersistedUriPermissions(); для(UriPermission uriPermission: uriPermissions){
Uri data = uriPermission.getUri(); profile.setImageURI(data); Picasso.get().load(data).into(profile); // this is just to test for the first user created. }
Мои разрешения на манифест:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
Пожалуйста, помогите, я застрял на этой проблеме на несколько дней. Я готов предоставить дополнительные разъяснения.
Ответ №1:
Приведенный выше код идеально подходит для сохранения разрешения uri. Проблема заключалась в том, что я использовал оттенок в просмотре изображений, и выбранное изображение блокировалось оттенком.