Autore Topic: visualizzare una foto appena scattata con la fotocamera del telefono  (Letto 1484 volte)

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Ciao a tutti, sto realizzando un'applicazione esempio che scatta una foto e la mostra in una view. Per la parte in cui scatta la foto ho seguito questo tutorial:

Code Licks: HowTo: usare la fotocamera su Android

Ho creato una semplice view per disegnare l'immagine appena caricata, di cui vi posto il codice
Codice: [Seleziona]
public class SimpleView extends View{

        private Bitmap bitmap;
    private Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
       
        public SimpleView(Context context, Bitmap bitmap) {
                super(context);
                this.bitmap = bitmap;
        }
       
        @Override
        protected void onDraw(Canvas canvas){
        canvas.drawBitmap( bitmap, null , new Rect(0,0,getWidth(),getHeight()),tmpPaint);
        }
}
poi ho creato i metodi  onActivityResult ho aggiunto due righe per creare una nuova nuova istanza di questa view e settare l'immagine appena ottenuta (le due ultime righe di codice del metodo)
Codice: [Seleziona]
public class MainActivity extends Activity {
       
        //dati che servono per la fotocamera
        private static final int CAMERA_REQUEST = 100; // un numero a nostro piacimento   
        File tmpFotoFile = null;
        byte[] bitmapdata; 
        ImageView preview; 
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

            try {
                        launchCamera();
                } catch (IOException e) {
                        throw new RuntimeException(e);
                }
        }
       
         private void launchCamera() throws IOException{ 
            
                   // Fase 1 
                   tmpFotoFile = File.createTempFile("myappprefix", null); 
           
                   // Fase 2 
                   Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                  cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tmpFotoFile)); 
                  startActivityForResult(cameraIntent, CAMERA_REQUEST); 
                  onActivityResult(CAMERA_REQUEST, RESULT_OK, cameraIntent);
         }
             
         protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
                 
                 if (requestCode == CAMERA_REQUEST) { 
                         Bitmap datifoto = null;
                         try {
                                        datifoto = android.provider.MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.fromFile(tmpFotoFile));
                                } catch (FileNotFoundException e) {
                                        throw new RuntimeException(e);
                                } catch (IOException e) {
                                        throw new RuntimeException(e);
                         } 
                 preview.setImageBitmap(datifoto); 
                 ByteArrayOutputStream bos = new ByteArrayOutputStream();   
                 datifoto.compress(CompressFormat.JPEG, 70, bos);   
                 bitmapdata = bos.toByteArray(); 
                     
                 tmpFotoFile.delete();
                 SimpleView view = new SimpleView(this, datifoto); //creo l'istanza della view...
                 setContentView(view); //e la setto
              } 
         } 
}

ma quando lo lancio ottengo questo errore:

07-11 16:05:23.121: E/AndroidRuntime(530): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.prova.main/it.prova.main.MainActivity}: java.lang.NullPointerException
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.os.Looper.loop(Looper.java:137)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.ActivityThread.main(ActivityThread.java:4424)
07-11 16:05:23.121: E/AndroidRuntime(530):    at java.lang.reflect.Method.invokeNative(Native Method)
07-11 16:05:23.121: E/AndroidRuntime(530):    at java.lang.reflect.Method.invoke(Method.java:511)
07-11 16:05:23.121: E/AndroidRuntime(530):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-11 16:05:23.121: E/AndroidRuntime(530):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-11 16:05:23.121: E/AndroidRuntime(530):    at dalvik.system.NativeStart.main(Native Method)
07-11 16:05:23.121: E/AndroidRuntime(530): Caused by: java.lang.NullPointerException
07-11 16:05:23.121: E/AndroidRuntime(530):    at it.prova.main.MainActivity.onActivityResult(MainActivity.java:66)
07-11 16:05:23.121: E/AndroidRuntime(530):    at it.prova.main.MainActivity.launchCamera(MainActivity.java:52)
07-11 16:05:23.121: E/AndroidRuntime(530):    at it.prova.main.MainActivity.onCreate(MainActivity.java:35)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.Activity.performCreate(Activity.java:4465)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-11 16:05:23.121: E/AndroidRuntime(530):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
07-11 16:05:23.121: E/AndroidRuntime(530):    ... 11 more

a cosa è dovuto? Grazie
« Ultima modifica: 11 Luglio 2012, 17:30:35 CEST da titanum »

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:visualizzare una foto appena scattata con la fotocamera del telefono
« Risposta #1 il: 12 Luglio 2012, 11:49:00 CEST »
0
ho fatto una prova eliminando dal metodo onActivityResult le righe codice che creano e settano la view e ho messo una semplice textview. Il metodo onCreate è diventato così:
Codice: [Seleziona]
@Override
        public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                    try {
                                launchCamera();
                        } catch (IOException e) {
                                throw new RuntimeException(e);
                        }
       
                    TextView textView = new TextView(this);
                    textView.setTextSize(40);
                    textView.setText("hello world");
       
                    setContentView(textView);
            }

quindi prova solo a scattare la foto e a mostrare una semplice schermata, ma non funziona, dopo la scansione non mostra nulla e da esattamente lo stesso errore che ho postato prima. Se commento la parte della fotocamera compresa nel blocco try-catch, invece, la textview viene mostrata. Come mai?
« Ultima modifica: 12 Luglio 2012, 11:59:49 CEST da titanum »

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:visualizzare una foto appena scattata con la fotocamera del telefono
« Risposta #2 il: 12 Luglio 2012, 12:22:57 CEST »
+1
Ci sono vari errori:

1) onActivityResult(CAMERA_REQUEST, RESULT_OK, cameraIntent); non deve essere chiamta nel metodo launchCamera().
2) nel metodo onActivityResult, preview.setImageBitmap(datifoto); --> l'oggetto preview è null.

Prova così:

Codice (Java): [Seleziona]
public class MainActivity extends Activity {
        // dati che servono per la fotocamera
        private static final int CAMERA_REQUEST = 100; // un numero a nostro
                                                                                                        // piacimento
        File tmpFotoFile = null;
        byte[] bitmapdata;
        ImageView preview;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                try {
                        launchCamera();
                } catch (IOException e) {
                        throw new RuntimeException(e);
                }
        }

        private void launchCamera() throws IOException {

                // Fase 1
                tmpFotoFile = File.createTempFile("myappprefix", null);

                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tmpFotoFile));
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
        }

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {

                if (requestCode == CAMERA_REQUEST) {
                        Bitmap datifoto = null;
                        try {
                                datifoto = android.provider.MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.fromFile(tmpFotoFile));
                        } catch (FileNotFoundException e) {
                                throw new RuntimeException(e);
                        } catch (IOException e) {
                                throw new RuntimeException(e);
                        }
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        datifoto.compress(CompressFormat.JPEG, 70, bos);
                        bitmapdata = bos.toByteArray();
                        tmpFotoFile.delete();

                        SimpleView view = new SimpleView(this, datifoto); // creo l'istanza
                                                                                                                                // // della
                                                                                                                                // view...
                        setContentView(view); // e la setto
                }
        }
}
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:visualizzare una foto appena scattata con la fotocamera del telefono
« Risposta #3 il: 12 Luglio 2012, 13:22:53 CEST »
0
Grazie denper,

ora la view compare ma non viene visualizzata l'immagine. Mettendo in debug l'applicazione vedo che il campo bitmap viene riempito. Come mai non viene visualizzato? Forse non è corretto il modo in cui lo stampo?
Grazie ancora
« Ultima modifica: 13 Luglio 2012, 09:42:26 CEST da titanum »

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:visualizzare una foto appena scattata con la fotocamera del telefono
« Risposta #4 il: 12 Luglio 2012, 15:38:10 CEST »
0
Nel metodo onDraw di SimpleView non avevo messo la riga:
Codice: [Seleziona]
super.onDraw(canvas);e ora quando lo lancio da questo errore

07-12 15:17:37.214: W/OpenGLRenderer(21537): Bitmap too large to be uploaded into a texture

per ridimensionare l'immagine nel metodo onActivityResult c'è questa riga
Codice: [Seleziona]
datifoto.compress(CompressFormat.JPEG, 70, bos);
il numero 70 indica il 70%, ho provato anche a ridimensioare ma da lo stesso errore. C'è un altro modo per ridimensionare le immagini?

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:visualizzare una foto appena scattata con la fotocamera del telefono
« Risposta #5 il: 12 Luglio 2012, 17:29:27 CEST »
0
Ho trovato: nel costruttore della view è ho sostituito

Codice: [Seleziona]
this.bitmap = bitmap

con

Codice: [Seleziona]
this.bitmap = Bitmap.createScaledBitmap(bitmap,480,320,false);//ridimensiono l'immagine
la riga
Codice: [Seleziona]
datifoto.compress(CompressFormat.JPEG, 70, bos);comprime nel formato richiesto ma il numero indica solo la qualità che si vuole mantenere e non tocca le dimensioni. Ora ho risolto, ma volevo chiedervi se avessi voluto salvare l'immagine invece che mostrarla a video, come avrei dovuto fare?

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:visualizzare una foto appena scattata con la fotocamera del telefono
« Risposta #6 il: 13 Luglio 2012, 08:15:31 CEST »
+1
Questo è un esempio per salvare la tua immagine sulla scheda SD.

Codice (Java): [Seleziona]
try {
                               
                                // Esempio per salvare l'immagine nella scheda SD
                                String path = Environment.getExternalStorageDirectory().toString();
                                File file = new File(path, "nomefoto.jpg");
                                FileOutputStream out = new FileOutputStream(file);
                                datifoto.compress(Bitmap.CompressFormat.JPEG, 90, out);
                                out.flush();
                                out.close();

                        } catch (Exception e) {
                                throw new RuntimeException(e);
                        }

ricordati di aggiungere il seguente permesso sul file AndroidManifest.xml.

Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial