- READ_MEDIA_VISUAL_USER_SELECTED: READ_MEDIA_VISUAL_USER_SELECTED > предоставлено разрешение, предоставляющее частичный и временный доступ к фотографиям и видео пользователя.
p>
- Выбор фотографий и видео: новинка в Android 14. Пользователь выбирает конкретные фотографии и видео, которые он хочет сделать доступными для вашего приложения. .
- Разрешить все: пользователь предоставляет полный доступ к библиотеке ко всем фотографиям и видео на устройстве.
- < strong>Не разрешать: пользователь запрещает любой доступ.
- В документе есть примечание, в котором упоминается:
Когда я пытаюсь реализовать средство выбора фотографий и протестировать свое приложение.
Шаг 1. Запрос разрешения: «READ_MEDIA_IMAGES», «READ_MEDIA_VISUAL_USER_SELECTED»
Шаг 2. Я выбираю «< strong>Выбрать фотографии и видео"
Шаг 3. Выберите несколько фотографий -> Разрешить
Результат: PhotoPicker по-прежнему отображает все медиаконтент на устройстве, а не только отображение медиаконтента, которому было предоставлено разрешение.
Я неправильно понимаю или это проблема с моим кодом?
Если я не правильно понял, каково реальное поведение? Что мне с этим делать?
Всем, пожалуйста, дайте мне знать. Спасибо.
Я применил средство выбора фотографий в двух случаях и получил одинаковые результаты. Вот мой код:
Случай 1 использует намерение:
Код: Выделить всё
public class MainActivity extends AppCompatActivity {
ImageView imageView;
Button takePictureButton;
int RESULT_CODE = 0;
int REQUEST_CODE = 1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.img);
takePictureButton = findViewById(R.id.btn_take_picture);
takePictureButton.setOnClickListener(view -> {
if (android.os.Build.VERSION.SDK_INT == 34) {
int result14 = this.checkSelfPermission(READ_MEDIA_VISUAL_USER_SELECTED);
boolean hasReadMediaPermissionAndroid14 = PackageManager.PERMISSION_GRANTED == result14;
if (hasReadMediaPermissionAndroid14) {
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.setType("image/*");
startActivityForResult(intent, RESULT_CODE);
} else {
requestPermissions(new String[] {READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED}, REQUEST_CODE);
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
imageView.setImageURI(data.getData());
}
}
}
Код: Выделить всё
public class MainActivity extends AppCompatActivity {
ImageView imageView;
Button takePictureButton;
int REQUEST_CODE = 1;
ActivityResultLauncher pickMedia =
registerForActivityResult(new ActivityResultContracts.PickVisualMedia(), uri -> {
if (uri != null) {
imageView.setImageURI(uri);
Log.d("PhotoPicker", "Selected URI: " + uri);
} else {
Log.d("PhotoPicker", "No media selected");
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.img);
takePictureButton = findViewById(R.id.btn_take_picture);
takePictureButton.setOnClickListener(view -> {
if (android.os.Build.VERSION.SDK_INT == 34) {
int result14 = this.checkSelfPermission(READ_MEDIA_VISUAL_USER_SELECTED);
boolean hasReadMediaPermissionAndroid14 = PackageManager.PERMISSION_GRANTED == result14;
if (hasReadMediaPermissionAndroid14) {
pickMedia.launch(new PickVisualMediaRequest.Builder()
.setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE)
.build());
} else {
requestPermissions(new String[]{READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED}, REQUEST_CODE);
}
}
}
);
}
- AndroidManifest.xml:
Код: Выделить всё
- activity_main.xml:
Код: Выделить всё
- доказательства: доказательства
Подробнее здесь: https://stackoverflow.com/questions/771 ... d-14-still
Мобильная версия