2014-12-21 19 views
9

Profil seçip kaydetmek için bir etkinliğim var. Bir görüntü görüntüsü ve kullanıcının bir görüntü seçmesini sağlamak için sonuç için galeri etkinliğini başlatan bir düğme vardır. galeri kapatıldığında, aşağıdaki kod çalıştırıldığında:Android'de kaydedilen bitmap, 3 bayt uzunluğundadır okunurken

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

Bu kodu debug ve doğruladıktan: - istisna atılır; - yazılı dosyalar tam veri miktarını içerir (jpg görüntüsü için 17kB, base64 sürümü için 24kB); - oluşturulan bitmap, görüntü görünümünde beklediğim ve doğru şekilde görüntülendiğidir.

popImageView, yalnızca bir görüntü seçilmeden önce öndeki diğer görünümlerin üstüne görüntü görünümünü vurmak için kullanılır; ve decodeAndScale yöntemi yalnızca bellekte bitmap verisinde çalışır ve hiçbir şey kaydetmez.

Ben etkinlik başladığında mevcut resmi yeniden çalıştığınızda Ancak, gösterilen görüntü boş ve jpeg dosyası Conly 3 bayt içerir: Burada

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

pictureExists dosya adı bulunan denetler olduğunu koleksiyon listFiles() tarafından döndürüldü. pictureFile.exists() doğru döndürür, ancak dediğim gibi, bu conly 3 bayt içerir. Ben de BitmapFactory.decodeX kullanmayı denedim, ancak dosya bozulduğundan, işe yaramazdı.

Nedenini anlamıyorum. Dosyanın tamamen yazıldığını kontrol ettim ve sonra yok oldu ... Nexus S'de hata ayıklama yaparken kod iyi çalıştı, ancak sonra Nexus 5'e geçtim ve kırdı.

+0

Dosya doğru okunduğunda ve daha sonra kesiliyorsa, dosyanızın üzerine bir şey yazılıyor. Bu hata ayıklama için bir yaklaşım programın çeşitli noktalarında "şimdi ne kadar büyük olduğunu" denetler veya dosya hala bozulmamış olup olmadığını görmek için sık sık 'ls -l 'yapmak hata ayıklayıcı ile adım eklemek olacaktır. Bir noktada boyut değişecek ve oradan daraltabileceksin. – fadden

+0

Bunu yaptım: boyut yalnızca ilk kez çağrıldığında onStart yönteminde okunduğunda farklıdır. – Totem

+0

Bu nedenle, onStart() boyutunda boyut yanlıştır, ancak adb kabuğundan bakıldığında boyut hala doğrudur? Ya da okuma işleviniz dosyanın uzunluğunu yanlış okuyor mu? Yoksa aktiviteyi başlatma eyleminin dosyayı kestiğini mi söylüyorsunuz? OnStart() yöntem girişinde bir kesme noktası koyarsanız, dosya zaten kesilir mi? Etkinlik nasıl başlatıldı - bu dosya hakkında bildikleri ne yapar? Dosya nerede saklanır? Başka ne erişimi var? – fadden

cevap

0

BitmapFactory kullanarak dosyayı bir bitmap kodunu çözmeyi denediniz mi?

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

Aşağıdaki kodu test değil ama sen deneyin edebilirsiniz:

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

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

Zaten çalıştı, işe yaramıyor. – Totem

0

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; 

ardından dosya yolu olarak selectedImagePath kullanan onActivityResult bu deneyin.

Yardım edin.

İlgili konular