Autore Topic: [medio] Come utilizzare la Camera di Android per scattare una foto  (Letto 8292 volte)

Offline dersew

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32A
  • Sistema operativo:
    ubuntu 10.04
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #15 il: 19 Luglio 2010, 22:14:34 CEST »
0
come immaginavo..vedo di implementare e sistemare il tutto :) thx

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #16 il: 19 Luglio 2010, 22:18:52 CEST »
0
come immaginavo..vedo di implementare e sistemare il tutto :) thx

Verifica in particolare la Camera.Parameters e le interfacce.  Fammi sapere  ;-)

Offline Ricky`

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 2696
  • Respect: +370
    • Google+
    • rciovati
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    OS X Lion
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #17 il: 20 Luglio 2010, 02:02:03 CEST »
+2
[OT]
In alternativa si può utilizzare l'app di default installata sul telefono per catturare l'immagine:

Codice (Java): [Seleziona]
Intent i = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );
                startActivityForResult( i, IMAGE_CAPTURE );
Codice (Java): [Seleziona]
@Override
protected void onActivityResult ( int requestCode, int resultCode, Intent data ) {

        if ( requestCode == IMAGE_CAPTURE ) {


                if ( resultCode == RESULT_CANCELED ) {

                        //Non è stata scattata nessuna foto
                        return;
                }

                Uri selectedImage = data.getData();

                //se è null vuol dire che la foto non è stata salvata automaticamente la salviamo manualemente
                if(selectedImage == null){
                        b = ( Bitmap ) data.getExtras().get( "data" );
                        selectedImage = MediaStore.Images.Media.insertImage( getContentResolver(), b, null, null );
                }
                       
                }
               
                super.onActivityResult( requestCode, resultCode, data );
}

Offline AlBeerTo

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Sistema operativo:
    Windows 7
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #18 il: 10 Agosto 2010, 12:45:18 CEST »
0
Salve a tutti!
Sono nuovo nella programmazione Android e devo dire che, venendo da un ambienta non-java, è piuttosto dura!  ;-)

Comunque scrivo perchè ho un problema facendo una modifica al codice di questo tutorial.
L'obiettivo è poter salvare l'immagine scattata sotto forma di file "jpg" nella root della SD.

Per fare questo ho modificato la seguente funzione:

Codice (Java): [Seleziona]
PictureCallback jpegCallback = new PictureCallback() {
                public void onPictureTaken(byte[] _data, Camera _camera) {
                        //riparte la preview della camera
                        mCamera.startPreview();
                       
                }
        };

in:

Codice (Java): [Seleziona]
    PictureCallback jpegCallback = new PictureCallback() {
                public void onPictureTaken(byte[] _data, Camera _camera) {
                       
                       
                File sdImageMainDirectory = new File("/sdcard");
                        FileOutputStream fileOutputStream = null;
                        String nameFile = "capturedpic";
                       
                        try {

                                BitmapFactory.Options options=new BitmapFactory.Options();
                                options.inSampleSize = 1;
                               
                                Bitmap myImage = BitmapFactory.decodeByteArray(_data,0,_data.length,options);
                               
                                fileOutputStream = new FileOutputStream(sdImageMainDirectory.toString()+"/"+nameFile+".jpg");
                                                               
                                BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);

                                myImage.compress(CompressFormat.JPEG, 100, bos);
                               
                                bos.flush();
                                bos.close();
                               
                               
                        } catch (FileNotFoundException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                       
                        //riparte la preview della camera
                        mCamera.startPreview();
                       
                       
                }
        };

Il programma parte senza problemi ma, dopo aver scattato la foto, non trovo l'immagine "capturedpic.jpg" nella SD... Dove sbaglio?

Grazie anticipatamente!
« Ultima modifica: 10 Agosto 2010, 13:39:30 CEST da Qlimax »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 732
  • Respect: +177
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Nexus One - Wildfire - Magic
  • Market Developer Name:
    egsolutions
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #19 il: 10 Agosto 2010, 14:14:00 CEST »
+1
Codice (Java): [Seleziona]
    PictureCallback jpegCallback = new PictureCallback() {
                public void onPictureTaken(byte[] _data, Camera _camera) {
                        //File sdImageMainDirectory = new File("/sdcard");
                        File root=Environment.getExternalStorageDirectory();
            String nameFile = "capturedpic.jpg";
            File img=new File(root,nameFile);
           
            try {
                    //BitmapFactory.Options options=new BitmapFactory.Options();
                    //options.inSampleSize = 1;                  
                    BitmapFactory.decodeByteArray(_data,0,_data.length).compress(CompressFormat.JPEG, 100, new FileOutputStream(img));
 
                             
            } catch (FileNotFoundException e) {
                    Log.e("demo", e.toString());
            }
           
            //riparte la preview della camera
            mCamera.startPreview();
                       
                }
        };

non dimenticarti di aggiungere questo al manifest:

Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

Offline AlBeerTo

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Sistema operativo:
    Windows 7
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #20 il: 11 Agosto 2010, 09:41:00 CEST »
0
Grazie mille, in effetti così funziona...

Ora il problema rimane la qualità dell'immagine, in quanto la foto è di una risoluzione imbarazzante (272x272).

Cercherò un po' per il forum e su google come risolvere. Nel frattempo, se qualcuno sa come fare, mi risparmierebbe tempo!!  ;-)

Grazie ancora.

EDIT:

Ok, mi rispondo da solo! Ho visto che nel codice già era presente la possibilità di cambiare risoluzione (ed era settata la più bassa).

Ho notato però che mettendo risoluzioni manuali, ad esempio:

Codice (Java): [Seleziona]
p.setPictureSize(800, 600);
L'applicazione crasha...
Rimuovendo, invece, il setPictureSize ho visto che il mio Hero, di default, prende l'immagine a 1024x768 che per me è, comunque, soddisfacente.
« Ultima modifica: 11 Agosto 2010, 10:48:51 CEST da AlBeerTo »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 732
  • Respect: +177
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Nexus One - Wildfire - Magic
  • Market Developer Name:
    egsolutions
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #21 il: 11 Agosto 2010, 14:15:02 CEST »
+1
Ho notato però che mettendo risoluzioni manuali, ad esempio:

Codice (Java): [Seleziona]
p.setPictureSize(800, 600);
L'applicazione crasha...
Rimuovendo, invece, il setPictureSize ho visto che il mio Hero, di default, prende l'immagine a 1024x768 che per me è, comunque, soddisfacente.

come vedi nel tutorial:
Codice (Java): [Seleziona]
ArrayList<Size> list = (ArrayList<Size>) p.getSupportedPictureSizes();  //recuepro le risoluzioni supportate dalla camera
int picture_width = list.get(list.size()-1).width;
int picture_height = list.get(list.size()-1).height;
p.setPictureSize(picture_width, picture_height);        //setto la camera alla risoluzione pi� bassa

le risoluzioni supportate sono contenute un un arraylist che ottieni dai parametri della fotocamera (getSupportedPictureSizes)

con

Codice (Java): [Seleziona]
int picture_width = list.get(0).width;
int picture_height = list.get(0).height;

hai la risoluzione massima supportata ;)

inserendo una risoluzione non supportata, l'applicazione crasha O:-)




Offline AlBeerTo

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Sistema operativo:
    Windows 7
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #22 il: 11 Agosto 2010, 14:28:18 CEST »
0
Grazie mille, avevo appunto trovato quà e là per la rete delle informazioni a proposito!  :-)

Ho visto che la 2048x1536 è supportata dal mio Hero, però seguirò il tuo consiglio e metterò la risoluzione massima possibile: almeno il codice rimane riutilizzabile anche su altri dispositivi che montano diverse fotocamere.

Ora devo passare al secondo step: passare l'immagine ottenuta tramite bluetooth! Ma quì vado offtopic  :-P

Cercherò un po' sul forum e in rete se trovo qualcosa.

Grazie ancora dell'aiuto!

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Market Developer Name:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #23 il: 31 Agosto 2010, 17:48:39 CEST »
0
Qualcuno sa xkè questo codice funziona su emulatore ma crasha sul telefono O.o... ho il problema opposto ho un htc Desire

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 732
  • Respect: +177
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Nexus One - Wildfire - Magic
  • Market Developer Name:
    egsolutions
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #24 il: 31 Agosto 2010, 18:18:42 CEST »
0
non sarebbe male se postassi il logcat ...

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Market Developer Name:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #25 il: 31 Agosto 2010, 18:35:14 CEST »
0
08-31 18:32:47.326: ERROR/AndroidRuntime(16911): FATAL EXCEPTION: main
08-31 18:32:47.326: ERROR/AndroidRuntime(16911): java.lang.RuntimeException: setParameters failed
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.hardware.Camera.native_setParameters(Native Method)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.hardware.Camera.setParameters(Camera.java:655)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at org.liquidjournal.CameraView.surfaceChanged(CameraView.java:76)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.SurfaceView.updateWindow(SurfaceView.java:546)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.View.draw(View.java:6742)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.View.draw(View.java:6742)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1872)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewRoot.draw(ViewRoot.java:1422)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1167)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1744)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.os.Looper.loop(Looper.java:144)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at android.app.ActivityThread.main(ActivityThread.java:4937)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at java.lang.reflect.Method.invokeNative(Native Method)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at java.lang.reflect.Method.invoke(Method.java:521)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-31 18:32:47.326: ERROR/AndroidRuntime(16911):     at dalvik.system.NativeStart.main(Native Method)

sembra qua il problema che dici?? :)

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Market Developer Name:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #26 il: 31 Agosto 2010, 18:41:59 CEST »
0
allora,  i settaggi dei parametri (p.setPreviewSize)vanno a causare crash, ho tolto i settaggi e sembra vada.
« Ultima modifica: 31 Agosto 2010, 18:57:42 CEST da DX89B »

Offline DX89B

  • Utente junior
  • **
  • Post: 121
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Market Developer Name:
    Daniele Bonadiman
  • Sistema operativo:
    Mac OS X 10.6
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #27 il: 02 Settembre 2010, 12:57:23 CEST »
0
allora , a me servirebbe una cosa, sapete come è possibile farla.
in pratica scattata alla foto e aperta l'anteprima si fermi e compaia un bottone che mi dia la possibilità di inviarla al mio server che faccia un riconoscimento OCR . oppure tornare alla foto.

non ho capito bene come funziona questa activity e vorrei capire dove devo mettere le mie funzioni per l'invio. se qualcuno mi da qualche suggerimento sarebbero gradite grazie

e c'è un modo per mettere il bottone sopra lo "stream" della fotocamera?
« Ultima modifica: 02 Settembre 2010, 13:51:18 CEST da DX89B »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 732
  • Respect: +177
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Nexus One - Wildfire - Magic
  • Market Developer Name:
    egsolutions
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #28 il: 02 Settembre 2010, 13:52:25 CEST »
0
crea una nuova discussione ed eventualmente inserisci il tuo codice ...
questo è un tutorial ;)

Offline enos

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:[medio] Come utilizzare la Camera di Android per scattare una foto
« Risposta #29 il: 10 Settembre 2010, 12:35:04 CEST »
0
se non ricordo male cambiava la gestione dei parametri della Camera, tipo che molti metodi erano proprio assenti. Ora non ricordo se si trattasse della 1.5 o della 1.6. Per quanto invece riguarda la struttura generale della surfaceView e dell'utilizzo dell'oggetto Camera, dovrebbe non cambiare nulla.
Con la 1.6 non funziona bene...
ricevo errori su:

Codice: [Seleziona]
p.getSupportedPictureSizes();
e su

Codice: [Seleziona]
p.setJpegQuality(80);
Sono ancora alle prime armi...: qualcuno saprebbe come risistemare il codice per la SDK 1.6?
Grazie  :-)