Taula de continguts

Media Gallery en Android

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.

, , , , , ,


Passes prèvies

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.


Codi curt

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.


Codi llarg

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 ;)

Codi llarg per a accés a la Galeria d'Imatges
Cal declarar els permisos adequats al AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

El codi de MainActivity:

MainActivity.kt
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)
    }
 
}