bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


android_camera

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
android_camera [2024/12/09 15:41]
enric_mieza_sanchez [Foto full-size i FileProvider : donant accés a l'espai privat]
android_camera [2024/12/16 15:53] (actual)
enric_mieza_sanchez [Tutorial Kotlin]
Línia 133: Línia 133:
     - Utilitza també les funcions d'emmagatzematge intern o extern (<del>''getFilesDir''</del> o ''getExternalFilesDir'').     - Utilitza també les funcions d'emmagatzematge intern o extern (<del>''getFilesDir''</del> o ''getExternalFilesDir'').
   - Transforma el ''File'' en ''Uri'' amb ''FileProvider.getUriForFile''   - Transforma el ''File'' en ''Uri'' amb ''FileProvider.getUriForFile''
-  - Llançar el ''Intent'' per a la App Camera amb l'afegit perquè ens retorni la foto //full-size//:<code java> +  - Llançar el ''Intent'' per a la App Camera amb l'afegit perquè ens retorni la foto //full-size//. Hauriem de tenir una cosa similar a això al ''Button.onClickListener'':<code java> 
-    // creem arxiu temporal +    // creem arxiu on volem guardar la imatge 
-    String filePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES).toString() + "/tmpImg.jpg";+    String filePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES 
 +                      ).toString() + "/tmpImg.jpg";
     File photoFile = new File( filePath );     File photoFile = new File( filePath );
-    // li donem permisos amb FileProvider pq pugui escriure l'app camera+    // li donem permisos amb FileProvider pq hi pugui escriure l'app camera 
 +    // ULL: la authority ha de ser la del vostre package "com....fileprovider" 
 +    //      igual que la que heu d'haver configurat al AndroidManifest.xml
     photoURI = FileProvider.getUriForFile(MainActivity.this,     photoURI = FileProvider.getUriForFile(MainActivity.this,
             "com.enricmieza.gallery25.fileprovider",             "com.enricmieza.gallery25.fileprovider",
Línia 148: Línia 151:
     cameraResultLauncher.launch(intent);     cameraResultLauncher.launch(intent);
 </code> </code>
-  - Quan rebem el resultat a la callback ''cameraResultLauncher'', podem utiltizar la mateixa ''Uri'' que ja hem fet servir per al ''FileProvider''.+  - Quan rebem el resultat a la callback ''cameraResultLauncher'', podem utilitzar la mateixa ''Uri'' que ja hem fet servir per al ''FileProvider'':<code java> 
 +    @Override 
 +    public void onActivityResult(ActivityResult result) { 
 +        if (result.getResultCode() == AppCompatActivity.RESULT_OK) { 
 +            // display foto 
 +            ImageView imageView = findViewById(R.id.imageView); 
 +            Intent data = result.getData(); 
 +            Bundle extras = data.getExtras(); 
 +            // si ve un bitmap, pinto el bitmap 
 +            if( extras!=null ) { 
 +                Bitmap imageBitmap = (Bitmap) extras.get("data"); 
 +                imageView.setImageBitmap(imageBitmap); 
 +                return; 
 +            } else { 
 +                // si no em retorna res, agafo la photoURI 
 +                // que hem configurat pel FileProvider 
 +                if( photoURI!=null ) { 
 +                    imageView.setImageURI(photoURI); 
 +                    return; 
 +                } 
 +                Log.e("ERROR","No hi ha cap photoURI"); 
 +            } 
 +        } 
 +    }</code>
  
 <WRAP todo> <WRAP todo>
Línia 173: Línia 199:
  
 ===== Imatge de la càmera dins la nostra App ===== ===== Imatge de la càmera dins la nostra App =====
 +
 +==== Tutorial Java (medium.com) ====
  
 Els objectes ''SurfaceView'' i ''PreviewView'' (//widgets// que podem incorporar al nostre //layout// de l'''Activity'') ens permeten veure el què captura la càmera directament sobre la nostra App. Sembla ser, però, que la gestió d'una ''SurfaceView'' és força complicada. Si emprem CameraX, serà més fàcil la gestió amb ''PreviewView''. Els objectes ''SurfaceView'' i ''PreviewView'' (//widgets// que podem incorporar al nostre //layout// de l'''Activity'') ens permeten veure el què captura la càmera directament sobre la nostra App. Sembla ser, però, que la gestió d'una ''SurfaceView'' és força complicada. Si emprem CameraX, serà més fàcil la gestió amb ''PreviewView''.
Línia 222: Línia 250:
 </WRAP> </WRAP>
  
 +\\
 +
 +==== Tutorial Kotlin ====
 +
 +Podem seguir les [[https://developer.android.com/codelabs/camerax-getting-started#0|indicacions del tutorial oficial d'Android per a CameraX]].
 +
 +Aquest tutorial empra [[https://developer.android.com/topic/libraries/view-binding|View Binding]] per accedir d'una forma més moderna a les views. Llegeix l'article abans.
 +
 +I com no, no es pot seguir al peu de la lletra, cal adaptar algunes coses. En concret al pas 2 "Crear el projecte". Resulta que l'arxiu ''build.gradle'' ara ha passat a ser ''build.gradle.kt'' especificat en format Kotlin també, pel què hi haurà algunes modificacions que indiquem tot seguit:
 +
 +  - Punt 1: les biblioteques de codi<code kotlin>
 +dependencies {
 +    // ...
 +
 +    val camerax_version = "1.4.1"
 +    implementation("androidx.camera:camera-core:${camerax_version}")
 +    implementation("androidx.camera:camera-camera2:${camerax_version}")
 +    implementation("androidx.camera:camera-lifecycle:${camerax_version}")
 +    implementation("androidx.camera:camera-video:${camerax_version}")
 +    implementation("androidx.camera:camera-view:${camerax_version}")
 +    implementation("androidx.camera:camera-extensions:${camerax_version}")
 +}</code>
 +  - El punt 2 de les ''compileOptions'' no cal, podem deixar el que ve per defecte amb VERSION_11:<code kotlin>
 +compileOptions {
 +        sourceCompatibility = JavaVersion.VERSION_11
 +        targetCompatibility = JavaVersion.VERSION_11
 +    }
 +</code>
 +  - El punt 3 queda així<code kotlin>
 +buildFeatures {
 +    viewBinding = true
 +}
 +</code>
 +
 +La resta queda igual. Cal anar amb compte de llegir bé els passos i entendre'ls.
 +
 +<WRAP todo>
 +Implementa el [[https://developer.android.com/codelabs/camerax-getting-started#0|tutorial oficial d'Android per a CameraX]]. Arriba a la part 5 del ''takePhoto''. No avancis un pas fins que no et funcioni com s'indica al final de cadascun d'ells.
 +
 +Redueix la ''PreviewView'' a mitja pantalla i afegeix una ''ImageView''. Quan es faci una captura d'imatge, visualitza la foto en la ''ImageView''. Hauria de quedar aproximadament així:
 +
 +{{ android:takePictureCameraX.png?200 }}
 +
 +
 +</WRAP>
  
 \\ \\
android_camera.1733758879.txt.gz · Darrera modificació: 2024/12/09 15:41 per enric_mieza_sanchez