2014-12-21 4 views
9

Ho un'attività per scegliere e salvare un'immagine del profilo. C'è una vista immagine e un pulsante che avvia l'attività della galleria per risultato che spinge l'utente a scegliere un'immagine. Quando la galleria è chiusa, viene eseguito il seguente codice:La bitmap salvata in Android è lunga 3 byte quando viene letta

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if ((resultCode == RESULT_OK) && (requestCode == SELECT_PHOTO)) { 
     Uri selectedImage = data.getData(); 

     try { 
      Bitmap image = this.decodeAndScaleImage(selectedImage, 285); 
      imgInsertPicture.setImageBitmap(image); 

      this.imagePresent = true; 
      this.saveMyProfilePicture(image); 
      this.popImageView(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      showToast(R.string.error_saving_picture); 
     } 
    } 
} 

private void saveMyProfilePicture(Bitmap picture) throws IOException { 
    FileOutputStream outputStream = openFileOutput(Globals.MY_PICTURE_FILE_NAME, MODE_PRIVATE); 
    picture.compress(Globals.MY_PICTURE_FORMAT, 90, outputStream); 
    outputStream.close(); 

    ByteArrayOutputStream rawOutputStream = new ByteArrayOutputStream(); 
    picture.compress(Globals.MY_PICTURE_FORMAT, 90, rawOutputStream); 

    byte[] rawPictureData = rawOutputStream.toByteArray(); 
    rawOutputStream.close(); 

    byte[] base64PictureData = Base64.encode(rawPictureData, Base64.DEFAULT); 
    rawPictureData = null; 

    FileOutputStream base64OutputStream = openFileOutput(Globals.MY_PICTURE_B64_FILE_NAME, MODE_PRIVATE); 
    base64OutputStream.write(base64PictureData); 
    base64OutputStream.close(); 
} 

ho il debug questo codice e verificato che: - non viene generata un'eccezione; - i file scritti contengono la quantità esatta di dati (17kB per l'immagine jpg, 24kB per la versione base64); - la bitmap prodotta è quella che mi aspetto e viene visualizzata correttamente nella vista immagine.

popImageView viene utilizzato solo per eseguire il bump della vista dell'immagine sopra altre viste che erano nella parte anteriore prima della scelta di un'immagine; e il metodo decodeAndScale funziona solo su dati bitmap in memoria e non salva nulla.

Tuttavia, quando provo a ricaricare l'immagine corrente quando l'attività si avvia, l'immagine visualizzata è vuoto e il file jpeg Conly contiene 3 byte:

@Override 
public void onStart() { 
    super.onStart(); 

    if (!imagePresent && pictureExists()) { 
     File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME); 
     imgInsertPicture.setImageURI(Uri.fromFile(pictureFile)); 
     popImageView(); 
     imagePresent = true; 
    } 
} 

Qui pictureExists Verifica che il nome file è contenuto in la raccolta restituita da listFiles(). pictureFile.exists() restituisce true, ma come ho detto, conly contiene 3 byte. Ho anche provato a utilizzare BitmapFactory.decodeX, ma poiché il file è danneggiato, è stato inutile.

Non riesco a capire perché. Ho controllato che il file sia stato scritto interamente e poi scompare ... Quando eseguivo il debug sul mio Nexus S, il codice funzionava bene, ma poi sono passato a un Nexus 5 e si è rotto.

+0

Se il file viene letto correttamente e in seguito trovato troncato, qualcosa sta sovrascrivendo il file. Un approccio al debug di questo sarebbe aggiungere "quanto è grande adesso" controlla in vari punti del tuo programma, o fare un passo con il debugger mentre fai frequenti 'ls -l' dalla shell adb per vedere se il file è ancora intatto. Ad un certo punto le dimensioni cambieranno e potrai restringere il campo da lì. – fadden

+0

Ho fatto questo: la dimensione è diversa solo quando viene letta nel metodo onStart quando viene chiamata per la prima volta. – Totem

+0

Quindi la dimensione è sbagliata in onStart(), ma la dimensione è ancora corretta quando viene visualizzata dalla shell adb? O la tua funzione di lettura non legge correttamente la lunghezza del file? O stai dicendo che l'atto di lanciare l'attività sta troncando il file? Se si inserisce un punto di interruzione nella voce del metodo onStart(), il file è già troncato? Come viene lanciata l'attività? Qualunque cosa stia lanciando, sa di questo file? Dove è archiviato il file? Cos'altro ha accesso ad esso? – fadden

risposta

0

Hai provato a decodificare il file in un bitmap utilizzando BitmapFactory?

http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java.lang.String)

non ho ancora testato il seguente codice ma si può riprova:

File pictureFile = new File(getFilesDir(), Globals.MY_PICTURE_FILE_NAME); 

Bitmap bitmapImage = BitmapFactory.decodeFile(Uri.fromFile(pictureFile)); 
imgInsertPicture.setImageBitmap(bitmapImage); 
popImageView(); 
imagePresent = true; 
+0

Già provato, non funziona. – Totem

0

Prova questo nella vostra onActivityResult

Uri selectedImage = data.getData(); 
String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

Cursor cursor = getActivity().getContentResolver().query(
          selectedImage, filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String filePath = cursor.getString(columnIndex); 
     cursor.close(); 


     selectedImagePath =filePath; 

quindi utilizzare selectedImagePath come percorso del file.

Spero che aiuti.