2014-10-06 34 views
6

Posso premere un pulsante, aprire l'app nativa della fotocamera e scattare una foto con successo. Ma poi quando controllo le app native di Gallery o Photos sul mio telefono, l'immagine non viene salvata lì. Sono molto nuovo per Android quindi è probabile che manchi qualcosa di importante nel mio codice.La fotocamera non sta salvando dopo aver scattato la foto

Domande:

1) Dove sono queste immagini stati salvati?

2) Posso modificare il codice riportato di seguito in qualche modo per salvare invece la memoria interna, quindi tutte le foto scattate con la mia app sono private e accessibili solo tramite la mia app?

3) Se volessi salvare queste immagini su un oggetto, insieme ad un testo/altro input, quale sarebbe il modo migliore? Devo semplicemente salvare un Uri o qualche identificatore per fare riferimento all'immagine in un secondo momento o salvare l'immagine effettiva BitMap?

Qualsiasi aiuto è molto apprezzato, grazie!

Ecco il mio codice per scattare la foto:

mImageButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     imageUri = CameraUtils.getOutputMediaFileUri(CameraUtils.MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, REQUEST_IMAGE); 
    } 
} 

CameraUtils classe presi direttamente da Google developer guides:

public static Uri getOutputMediaFileUri(int type) 
{ 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

public static File getOutputMediaFile(int type) 
{ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "camera"); 

    if (!mediaStorageDir.exists()) 
    { 
     if (!mediaStorageDir.mkdirs()) 
     { 
      return null; 
     } 
    } 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) 
    { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "IMG_" + timeStamp + ".jpg"); 
    } 
    else if(type == MEDIA_TYPE_VIDEO) 
    { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "VID_" + timeStamp + ".mp4"); 
    } 
    else 
    { 
     return null; 
    } 

    return mediaFile; 
} 

risposta

4

1) Guardando il codice, mi aspetto le immagini da salvato in una directory chiamata 'camera' che si trova nella cartella Immagini sul dispositivo (memoria esterna). Questi potrebbero non comparire immediatamente nella tua galleria, tuttavia nelle versioni successive di Android (Kitkat e forse jelly-bean anche se non posso verificarlo adesso) dovresti riuscire ad aprire l'app Foto e trovarli da qualche parte lì dentro. In caso contrario, avviare un'app di esplorazione file (le app di esempio sono ASTRO File Manager o X-Plore) e accedere alla directory Immagini/videocamere in cui dovrebbero essere visualizzate le immagini. La prossima volta che i tuoi file multimediali verranno reindicizzati (riavvio del telefono o un reindicatore attivato da un'altra posizione), dovresti vedere queste immagini nelle tue app galleria/foto. Se vuoi aggiornare i tuoi contenuti multimediali in modo programmatico, potrebbe essere utile il here. Infine, assicurati di avere l'autorizzazione READ_EXTERNAL_STORAGE nel tuo manifest Android come specificato this (documento Android).

2) Se si desidera salvare le immagini solo per la propria applicazione, è necessario salvarle nella directory dei dati interni dell'applicazione. Dai uno sguardo allo this direttamente dal documento Android. Assicurati di utilizzare il flag MODE_PRIVATE.

3) Per questo, si vorrebbe memorizzare il percorso del file da qualche parte accessibile alla propria app. O è possibile salvare i percorsi dei file in un file di testo con altri dati di testo oppure utilizzare un database SQLite. Infine, è possibile utilizzare un ORM come ORMLite per Android per salvare un oggetto java che potrebbe contenere dati per la propria immagine e avere alcuni campi che si desidera mantenere (titolo, descrizione, percorso, ecc.). Here e here è un'introduzione su come iniziare con il database SQLite in Android (direttamente dal documento ufficiale). Se vuoi usare ORMLite, ci sono molte informazioni sul loro sito here. Lo sviluppatore ha trascorso molto tempo a rispondere alle domande StackOverflow ..

Tutte le tue domande possono essere risolte con alcune semplici ricerche su Google. Sono cose standard e di base da fare in Android, quindi dovresti essere in grado di trovare una miriade di informazioni e tutorial online.

EDIT:

In risposta al tuo commento sulla seconda domanda. Questo è quello che probabilmente farei (o qualcosa di simile):

Nota che non l'ho provato. È dalla cima della mia testa. Se hai più problemi, commenta qui!

Codice attività ...

mImageButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     imageUri = CameraUtils.getOutputMediaFileUri(currentActivity, CameraUtils.MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, REQUEST_IMAGE); 
    } 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == REQUEST_IMAGE) 
    { 
     if (resultCode == RESULT_OK) 
     { 
      String pathToInternallyStoredImage = CameraUtils.saveToInternalStorage(this, imageUri); 
      // Load the bitmap from the path and display it somewhere, or whatever 
     } 
     else if (resultCode == RESULT_CANCELED) 
     { 
      //Cancel code 
     } 
    } 
} 

CameraUtils codice della classe ...

public static Uri getOutputMediaFileUri(int type) 
{ 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

public static File getOutputMediaFile(int type) 
{ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "camera"); 

    createMediaStorageDir(mediaStorageDir); 

    return createFile(type, mediaStorageDir); 
} 

private static File getOutputInternalMediaFile(Context context, int type) 
{ 
    File mediaStorageDir = new File(context.getFilesDir(), "myInternalPicturesDir"); 

    createMediaStorageDir(mediaStorageDir); 

    return createFile(type, mediaStorageDir); 
} 

private static void createMediaStorageDir(File mediaStorageDir) // Used to be 'private void ...' 
{ 
    if (!mediaStorageDir.exists()) 
    { 
     mediaStorageDir.mkdirs(); // Used to be 'mediaStorage.mkdirs();' 
    } 
} // Was flipped the other way 

private static File createFile(int type, File mediaStorageDir) // Used to be 'private File ...' 
{ 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile = null; 
    if (type == MEDIA_TYPE_IMAGE) 
    { 
     mediaFile = new File(mediaStorageDir .getPath() + File.separator + 
       "IMG_" + timeStamp + ".jpg"); 
    } 
    else if(type == MEDIA_TYPE_VIDEO) 
    { 
     mediaFile = new File(mediaStorageDir .getPath() + File.separator + 
       "VID_" + timeStamp + ".mp4"); 
    } 
    return mediaFile; 
} 

public static String saveToInternalStorage(Context context, Uri tempUri) 
{ 
    InputStream in = null; 
    OutputStream out = null; 

    File sourceExternalImageFile = new File(tempUri.getPath()); 
    File destinationInternalImageFile = new File(getOutputInternalMediaFile(context).getPath()); 

    try 
    { 
     destinationInternalImageFile.createNewFile(); 

     in = new FileInputStream(sourceExternalImageFile); 
     out = new FileOutputStream(destinationInternalImageFile); 

     // Transfer bytes from in to out 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) 
     { 
      out.write(buf, 0, len); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
     //Handle error 
    } 
    finally 
    { 
     try { 
      if (in != null) { 
       in.close(); 
      } 
      if (out != null) { 
       in.close(); 
      } 
     } catch (IOException e) { 
      // Eh 
     } 
    } 
    return destinationInternalImageFile.getPath(); 
} 

Così ora avete il percorso che punta alla vostra immagine memorizzato internamente, che è possibile quindi manipola/carica dal tuo onActivityResult.

+0

Grazie per la risposta! Per quanto riguarda il n. 2, ho già visto quella parte dei documenti, ma non sono sicuro di come implementarla nella mia app. Conosci qualche esempio che mostra come farlo? Posso trovare solo frammenti di codice. – pez

+0

Grazie ancora! Eseguendo il codice sul mio telefono, sembra sempre che si blocchi nell'app fotocamera subito dopo aver scattato la foto. Usando 'Log.d', sembra che tutto venga chiamato e logcat non mostra errori. Ma dopo aver scattato la foto, non mi consentirà di confermarla con il segno di spunta nell'app nativa della fotocamera; Posso solo premere la "x" per riprendere l'immagine o premere i pulsanti Home o Indietro sulla barra di navigazione del mio telefono. – pez

+1

Hai queste tre autorizzazioni nel tuo manifest di Android? '' '' ' ' Hai solo bisogno del permesso di scrittura per salvare le immagini (così come la funzione fotocamera credo). Ma di solito anche la lettura è inclusa poiché probabilmente ne avrai bisogno. – maraci

Problemi correlati