2014-12-21 11 views
9

Ich habe eine Aktivität zu wählen und speichern Sie ein Profilbild. Es gibt eine Bildansicht und eine Schaltfläche, die die Galerieaktivität für das Ergebnis startet, wodurch der Benutzer ein Bild auswählen kann. Wenn die Galerie geschlossen ist, wird der folgende Code ausgeführt:Gespeicherte Bitmap in Android ist 3 Bytes lang, wenn gelesen

@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(); 
} 

ich diesen Code auf Fehler und überprüft, dass: - keine Ausnahme ausgelöst wird; - die geschriebenen Dateien enthalten die genaue Datenmenge (17kB für das JPG-Bild, 24kB für die base64-Version); - Die erzeugte Bitmap ist die, die ich erwarte und die korrekt in der Bildansicht angezeigt wird.

popImageView wird nur verwendet, um die Bildansicht über andere Ansichten zu stoßen, die sich vor der Auswahl eines Bildes auf der Vorderseite befanden. und decodeAndScale-Methode funktioniert nur für Bitmap-Daten im Speicher und speichert nichts.

aber wenn ich versuche, das aktuelle Bild neu zu laden, wenn die Aktivität beginnt, angezeigtes Bild ist leer und die JPEG-Datei Conly enthält 3 Bytes:

@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; 
    } 
} 

Hier pictureExists überprüft, ob der Dateiname in enthalten ist die Sammlung, die von listFiles() zurückgegeben wird. pictureFile.exists() gibt true zurück, aber wie gesagt, es enthält 3 Bytes. Ich habe auch versucht, BitmapFactory.decodeX, aber da die Datei kaputt ist, war es nutzlos.

Ich kann nicht verstehen, warum. Ich habe überprüft, dass die Datei vollständig geschrieben wurde und verschwindet dann ... Als ich auf meinem Nexus S debugging, funktionierte der Code gut, aber dann wechselte ich zu einem Nexus 5 und es brach.

+0

Wenn die Datei korrekt gelesen wird und später abgeschnitten wird, überschreibt etwas Ihre Datei. Ein Ansatz zum Debuggen wäre das Hinzufügen von "wie groß ist es jetzt" an verschiedenen Punkten in Ihrem Programm oder Schritt mit dem Debugger, während häufige 'ls -l' von Adb-Shell zu sehen, ob die Datei noch intakt ist. Irgendwann wird sich die Größe ändern, und Sie können es von dort eingrenzen. – fadden

+0

Ich habe dies getan: die Größe unterscheidet sich nur beim Lesen in der onStart-Methode, wenn es zum ersten Mal aufgerufen wird. – Totem

+0

Also ist die Größe in onStart() falsch, aber die Größe ist immer noch richtig, wenn von AdB Shell aus betrachtet? Oder liest Ihre Lesefunktion die Länge der Datei falsch? Oder sagst du, dass der Akt des Startens der Aktivität die Datei abschneidet? Wenn Sie beim onStart() - Methodeneintrag einen Haltepunkt setzen, ist die Datei dann bereits abgeschnitten? Wie wird die Aktivität gestartet? Was weiß die Datei, wenn sie gestartet wird? Wo ist die Datei gespeichert? Was hat sonst noch Zugang dazu? – fadden

Antwort

0

Haben Sie versucht, die Datei mit BitmapFactory zu einer Bitmap zu dekodieren?

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

Haben Sie den folgenden Code nicht getestet, aber können Sie versuchen Sie es:

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

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

Bereits versucht, funktioniert nicht. – Totem

0

Versuchen Sie dies in Ihrem 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; 

dann selectedImagePath als Dateipfad verwenden.

Ich hoffe, es hilft.

Verwandte Themen