====== 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''. {{android:android-gallery0.png?200}} {{android:android-gallery1.png?200}} 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. {{tag> #Dam #DamMp08 #DamMp08Uf2 #DamMp08Uf02 Android mobile java }} \\ ===== 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: * **Virtual Scene**: escena 3D (l'habitació amb el gat, el gos, la TV i la cuina). Ets pots moure dins l'estança i apuntar en diferents llocs. * **Emulated**: un dibuix ultrapixelat molt bàsic. * **Webcam**: enllaç a la càmera real del dispositiu (si estàs en un PC, la webcam). IMPORTANT: Haurem de crear un ''Button'' i un ''ImageView'' al //layout// de ''activity_main.xml''. \\ ===== Codi curt ===== Mireu el [[https://developer.android.com/training/basics/intents/result#launch|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'': 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) } } <--