33

Ho riscontrato un problema nel catturare un'immagine e archiviarla dall'app nativa della fotocamera. Ecco un esempio di alcuni dei miei codici.Come acquisire un'immagine e archiviarla con la videocamera Android nativa

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg"; 
File file = new File(_path); 
Uri outputFileUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

startActivityForResult(intent, 0); 

Dopo che la foto è stata scattata e sto tornato di nuovo alla mia attività originaria, quando navigo alla mia scheda SD tramite Android DDMS Esplora file l'immagine non c'è. Qualcuno sa perché questo non viene salvato?

+0

Ciao a tutti, voglio cattura delle immagini dalla fotocamera nativa di Android e conservarlo ..così che ho fatto di taglie per tradizione familiare, preoccupante con esso –

+0

Paresh quali sono i tuoi problemi con la cattura dell'immagine? L'approccio mostrato in questa domanda non funziona per te? – Janusz

+0

@Janusz Devo inserire una Textview (nome dell'attività), un pulsante (in basso) e al centro dello schermo, l'anteprima della fotocamera è lì e sull'evento clic del pulsante, la foto deve essere cliccata e la foto deve essere visualizzata in visualizzazione di immagini di un'altra attività –

risposta

20

Avete verificato quale sia l'output di Environment.getExternalStorageDirectory(), perché se non contiene un file finale seperator (/) l'immagine finirà in una directory che non risiede sulla scheda SD come:

/mnt/sdcardmake_machine_example.jpg 

Quando ciò che si vuole veramente è:

/mnt/sdcard/make_machine_example.jpg 

Prova questo codice invece:

_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg"; 
+2

sì, posso confermare che sarà necessario aggiungere il separatore di file –

14

1. Basta usare

new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg"); 

e non preoccuparti dei separatori.

2. Di fronte allo stesso problema prima. I telefoni SenseUI hanno un'applicazione per telecamera personalizzata che non crea file. Quale dispositivo stai usando? Potrebbe essere già stato risolto nei dispositivi più recenti, ma potrebbe anche essere un problema. Quindi ecco un esempio completo su come superarlo Problems saving a photo to a file.

25

qui è stato il prodotto finale nel caso qualcuno è ancora in visita a questa discussione:

public class CameraCapture extends Activity { 

    protected boolean _taken = true; 
    File sdImageMainDirectory; 

    protected static final String PHOTO_TAKEN = "photo_taken"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     try { 

      super.onCreate(savedInstanceState);   
        File root = new File(Environment 
          .getExternalStorageDirectory() 
          + File.separator + "myDir" + File.separator); 
        root.mkdirs(); 
        sdImageMainDirectory = new File(root, "myPicName"); 


       startCameraActivity(); 
      } 
     } catch (Exception e) { 
      finish(); 
      Toast.makeText(this, "Error occured. Please try again later.", 
        Toast.LENGTH_SHORT).show(); 
     } 

    } 

    protected void startCameraActivity() { 

     Uri outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (resultCode) { 
     case 0: 
      finish(); 
      break; 

     case -1: 

      try { 
       StoreImage(this, Uri.parse(data.toURI()), 
         sdImageMainDirectory); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      finish(); 
      startActivity(new Intent(CameraCapture.this, Home.class)); 

     } 

    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { 
      _taken = true; 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); 
    } 

     public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) { 
     Bitmap bm = null; 
     try { 
      bm = Media.getBitmap(mContext.getContentResolver(), imageLoc); 
      FileOutputStream out = new FileOutputStream(imageDir); 
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      bm.recycle(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+1

È necessario impostare autorizzazioni extra nel manifest? Non riesco a dare il mio nome al file immagine salvato in SD – Vincent

+0

sì ... \t ninjasense

+0

Ciao Ninja !! Posso sapere, cosa è "Home.class" ???? il suo dire di creare una classe/enume ecc. Sono nuovo nella programmazione di Android. – iankits

-5

Aggiungi questa linea in AndroidManifest.xml di file e rimuovere l'estensione make_machine_example:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Inizierà per acquisire la foto e archiviarla nella scheda SD.

+0

non memorizzerà l'immagine catturata. –

1

Si dovrebbe eseguire una scansione media dopo il salvataggio dell'immagine

sendBroadcast(new Intent(
      Intent.ACTION_MEDIA_MOUNTED, 
      Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
Problemi correlati