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.
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
Ho fatto questo: la dimensione è diversa solo quando viene letta nel metodo onStart quando viene chiamata per la prima volta. – Totem
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