Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
|
android_camera [2023/01/23 15:39] enric_mieza_sanchez [Imatge de la càmera dins la nostra App] |
android_camera [2024/12/16 15:53] (actual) enric_mieza_sanchez [Tutorial Kotlin] |
||
|---|---|---|---|
| Línia 11: | Línia 11: | ||
| * [[Android persistència]] | * [[Android persistència]] | ||
| * [[https:// | * [[https:// | ||
| - | * [[https:// | + | * [[https:// |
| * [[https:// | * [[https:// | ||
| Línia 31: | Línia 31: | ||
| ===== Utilitzant la App Camera externa ===== | ===== Utilitzant la App Camera externa ===== | ||
| - | Podem emprar el [[https:// | + | Podem emprar el [[https:// |
| El què sí que està obsolet del tutorial és com llençar una altra app externa per rebre dades. Inicialment es feia amb el mètode < | El què sí que està obsolet del tutorial és com llençar una altra app externa per rebre dades. Inicialment es feia amb el mètode < | ||
| Aquest [[https:// | Aquest [[https:// | ||
| + | |||
| + | De fet, l' | ||
| + | |||
| + | ==== Comencem accedint a la Galeria d' | ||
| <WRAP todo> | <WRAP todo> | ||
| **Exercici galeria d' | **Exercici galeria d' | ||
| - | Segueix | + | Implementa |
| - | Ens servirà per practicar amb la [[https:// | + | També hi ha una solució indicada al primer exemple de l'[[https:// |
| - | Per implementar | + | **Tant si seguim |
| + | |||
| + | <WRAP important> | ||
| + | Si utilitzes el tutorial com a referència, | ||
| - Només cal que posis el codi de la '' | - Només cal que posis el codi de la '' | ||
| - | - Caldrà que afegeixis una '' | ||
| - La línia< | - La línia< | ||
| - L' | - L' | ||
| </ | </ | ||
| + | |||
| + | Al final ha de quedar més o menys així: | ||
| + | |||
| + | <code java> | ||
| + | public class MainActivity extends AppCompatActivity { | ||
| + | public static int RC_PHOTO_PICKER = 0; | ||
| + | ActivityResultLauncher< | ||
| + | | ||
| + | @Override | ||
| + | protected void onCreate(Bundle savedInstanceState) { | ||
| + | super.onCreate(savedInstanceState); | ||
| + | // ...mes codi de inicialització... | ||
| + | |||
| + | someActivityResultLauncher = registerForActivityResult( | ||
| + | // ...tota la carretada per crear la callback | ||
| + | // i pintar la foto a l' | ||
| + | }); | ||
| + | |||
| + | Button button = findViewById(R.id.button); | ||
| + | button.setOnClickListener(new View.OnClickListener() { | ||
| + | // ...creem i cridem l' | ||
| + | }); | ||
| + | |||
| + | } // onCreate | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Accedim a la càmera i rebem una miniatura o thumbnail ==== | ||
| <WRAP TODO> | <WRAP TODO> | ||
| **Exercici Take Photo thumbnail** | **Exercici Take Photo thumbnail** | ||
| - | Segueix la primera part del [[https:// | + | Segueix la primera part del [[https:// |
| + | - El **codi perquè l''' | ||
| + | fotoButton.setOnClickListener(new View.OnClickListener() { | ||
| + | @Override | ||
| + | public void onClick(View v) { | ||
| + | //Create Intent | ||
| + | Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); | ||
| + | cameraResultLauncher.launch(intent); | ||
| + | }</ | ||
| - Inicialment només captarem el // | - Inicialment només captarem el // | ||
| - Implementa la crida a la app externa amb la [[https:// | - Implementa la crida a la app externa amb la [[https:// | ||
| Línia 88: | Línia 133: | ||
| - Utilitza també les funcions d' | - Utilitza també les funcions d' | ||
| - Transforma el '' | - Transforma el '' | ||
| - | - Llançar el '' | + | - Llançar el '' |
| - | - Quan rebem el resultat a '' | + | // creem arxiu on volem guardar la imatge |
| + | String filePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES | ||
| + | ).toString() + "/ | ||
| + | File photoFile = new File( filePath ); | ||
| + | // li donem permisos amb FileProvider pq hi pugui escriure l'app camera | ||
| + | // ULL: la authority ha de ser la del vostre package " | ||
| + | // igual que la que heu d' | ||
| + | photoURI = FileProvider.getUriForFile(MainActivity.this, | ||
| + | " | ||
| + | photoFile); | ||
| + | |||
| + | // Create Intent | ||
| + | Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); | ||
| + | // Afegir arxiu amb permisos del FileProvider al Intent | ||
| + | intent.putExtra(MediaStore.EXTRA_OUTPUT, | ||
| + | cameraResultLauncher.launch(intent); | ||
| + | </ | ||
| + | - Quan rebem el resultat a la callback | ||
| + | @Override | ||
| + | public void onActivityResult(ActivityResult result) { | ||
| + | if (result.getResultCode() == AppCompatActivity.RESULT_OK) { | ||
| + | // display foto | ||
| + | | ||
| + | Intent data = result.getData(); | ||
| + | Bundle extras = data.getExtras(); | ||
| + | // si ve un bitmap, pinto el bitmap | ||
| + | if( extras!=null ) { | ||
| + | Bitmap imageBitmap = (Bitmap) extras.get(" | ||
| + | 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(" | ||
| + | } | ||
| + | } | ||
| + | }</ | ||
| <WRAP todo> | <WRAP todo> | ||
| **Exercici take photo full size** | **Exercici take photo full size** | ||
| - | Segueix la **part "Take full size photo" | + | Segueix la **part "Take full size photo" |
| **Recorda ha de ser la versió en anglès**, la traducció al castellà té errors. | **Recorda ha de ser la versió en anglès**, la traducció al castellà té errors. | ||
| - | Adapta els fragments de codi a la nostra | + | **App v0.3** - Afegeix un altre botó a l'app que hem fet a l' |
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP todo> | ||
| + | **Exercici MyGallery** | ||
| + | |||
| + | Implementa la recuperació de la imatge | ||
| + | |||
| + | **App v0.4** - Implementa la visualització de les fotos que anem prenent en l' | ||
| </ | </ | ||
| Línia 105: | 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 '' | Els objectes '' | ||
| Línia 118: | Línia 214: | ||
| <WRAP todo> | <WRAP todo> | ||
| - | **Exercici PreviewView** | + | **Exercici PreviewView |
| Farem una captura d' | Farem una captura d' | ||
| + | |||
| + | \\ | ||
| **Primera part: in-app preview** | **Primera part: in-app preview** | ||
| - | Utilitza aquest | + | Referència: |
| + | * [[https:// | ||
| + | * Consulteu la [[https:// | ||
| + | * Alguns //hacks// que cal fer, ja que el tutorial utilitza la v1.0.0 de CameraX, i les versions successives tenen alguns canvis: | ||
| + | * '' | ||
| + | * '' | ||
| + | * Probablement al crear el //layout// des del XML no funcioni la vista prèvia | ||
| - | ** Segona part: captura d' | + | \\ |
| - | Implementa la captura d' | + | **Segona part: captura d' |
| - | Tenim un parell | + | Implementa la captura d' |
| - | * [[https:// | + | |
| - | * [[https:// | + | Referència: |
| + | * [[https:// | ||
| Pistes: | Pistes: | ||
| Línia 144: | Línia 249: | ||
| </ | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ==== Tutorial Kotlin ==== | ||
| + | |||
| + | Podem seguir les [[https:// | ||
| + | |||
| + | Aquest tutorial empra [[https:// | ||
| + | |||
| + | I com no, no es pot seguir al peu de la lletra, cal adaptar algunes coses. En concret al pas 2 "Crear el projecte" | ||
| + | |||
| + | - Punt 1: les biblioteques de codi< | ||
| + | dependencies { | ||
| + | // ... | ||
| + | |||
| + | val camerax_version = " | ||
| + | implementation(" | ||
| + | implementation(" | ||
| + | implementation(" | ||
| + | implementation(" | ||
| + | implementation(" | ||
| + | implementation(" | ||
| + | }</ | ||
| + | - El punt 2 de les '' | ||
| + | compileOptions { | ||
| + | sourceCompatibility = JavaVersion.VERSION_11 | ||
| + | targetCompatibility = JavaVersion.VERSION_11 | ||
| + | } | ||
| + | </ | ||
| + | - El punt 3 queda així< | ||
| + | buildFeatures { | ||
| + | viewBinding = true | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | La resta queda igual. Cal anar amb compte de llegir bé els passos i entendre' | ||
| + | |||
| + | <WRAP todo> | ||
| + | Implementa el [[https:// | ||
| + | |||
| + | Redueix la '' | ||
| + | |||
| + | {{ android: | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Codis QR ===== | ||
| + | |||
| + | Una aplicació interessant de la càmera pot ser amb generació i escaneig de codis QR. | ||
| + | |||
| + | Aquestes llibreries funcionen (a Febrer de 2023): | ||
| + | * [[https:// | ||
| + | * Si us surt el QR borrós (blurred) caldrà [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | \\ | ||