Farem una aplicació per accedir als arxius multimèdia del dispositiu, una foto en aquest cas, i mostrar-la dins la nostra app en un ImageView.
L'accés a la galeria multimèdia haurà de demanar permisos per accedir als arxius compartits. Inicialment es feia amb permisos estàtics a l'AndroidManifest.xml però des de Android 6+ (API 23+) es fa amb permisos dinàmics dins el nostre codi per accedir la galeria de fotos compartida.
Necessitem algunes fotos dins el dispositiu de l'emulador quan treballem amb Android Studio. Ves a l'aplicació de fotos i fes algunes perquè el carret de la càmera tingui alguns exemples.
Per simular la captura de fotos podem ajustar les càmeres frontal i interna amb diverses opcions:
IMPORTANT:
Haurem de crear un Button i un ImageView al layout de activity_main.xml.
Mireu el codi "Launch an Activity for result" de la documentació oficial d'Android. És així de curt perquè hi ha moltes coses implícites com deixar que el sistema operatiu demani els permisos a l'usuari
Caldrà afegir l'acció de la callback on diu «Handle the returned Uri», i aplicar la imatge que ens arriba en forma de Uri al ImageView que tinguem.
Qui vol un codi llarg? Doncs per quan volem particularitzar coses més explícites.
O perquè no he sabut trobar el codi curt abans ;)
AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
El codi de MainActivity:
package com.enric.galeria // imports... class MainActivity : AppCompatActivity() { private lateinit var imageView: ImageView private lateinit var btnSelectImage: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Inicializar vistas imageView = findViewById(R.id.imageView) btnSelectImage = findViewById(R.id.button) // Configurar botó btnSelectImage.setOnClickListener { checkAndRequestPermission() } } // Permís necessari per a Android 13+ (API 33+) private val requestPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted: Boolean -> if (isGranted) { openGallery() } else { Toast.makeText( this, "Permís denegat. No pots seleccionar imatges.", Toast.LENGTH_SHORT ).show() } } // Obrir galeria i obtenir resultat private val galleryLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK) { val data: Intent? = result.data val selectedImageUri: Uri? = data?.data if (selectedImageUri != null) { // Mostrar imatge seleccionada imageView.setImageURI(selectedImageUri) } else { Toast.makeText( this, "No s'ha pogut carregar la imatge.", Toast.LENGTH_SHORT).show() } } } private fun checkAndRequestPermission() { // Aquesta línia ens obliga a indicar permisos al AndroidManifest.xml val permission = android.Manifest.permission.READ_MEDIA_IMAGES if (ContextCompat.checkSelfPermission( this,permission) == PackageManager.PERMISSION_GRANTED) { // Permís ja concedit openGallery() } else { // Sol·licitar permís requestPermissionLauncher.launch(permission) } } private fun openGallery() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } galleryLauncher.launch(intent) } }