====== 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)
}
}
<--