2014-01-17 31 views
12

嘿,我不知道为什么每次我在我的画廊中选择一个图像时,这会继续出现?BitmapFactory无法解码流

下面是代码:

if (v == uploadImageButton) { 
         // below allows you to open the phones gallery 
         Intent intent = new Intent(); 
         intent.setType("image/*"); 
         intent.setAction(Intent.ACTION_GET_CONTENT); 
         startActivityForResult(
             Intent.createChooser(intent, "Complete action using"), 1); 
       } 


public void onActivityResult(int requestCode, int resultCode, Intent data) { 
       if (resultCode == RESULT_OK && requestCode == 1 && null != data) { 
         // Bitmap photo = (Bitmap) data.getData().getPath(); 
         Uri selectedImageUri = data.getData(); 
         String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

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

         int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
         String picturePath = cursor.getString(columnIndex); 
         cursor.close(); 
         Log.e("Picture", picturePath); 
         decodeFile(picturePath); 
       } 
     } 


public void decodeFile(String filePath) { 
       // TODO Auto-generated method stub 
       // Decode image size 
       BitmapFactory.Options o = new BitmapFactory.Options(); 
       o.inJustDecodeBounds = true; 
       BitmapFactory.decodeFile(filePath, o); 

       // the new size we want to scale to 
       final int REQUIRED_SIZE = 1024; 

       // Find the correct scale value. It should be the power of 2. 
       int width_tmp = o.outWidth, height_tmp = o.outHeight; 
       int scale = 1; 
       while (true) { 
         if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) { 
           break; 
         } 
         width_tmp /= 2; 
         height_tmp /= 2; 
         scale *= 2; 
       } 

       // decode with inSampleSize 
       BitmapFactory.Options o2 = new BitmapFactory.Options(); 
       o2.inSampleSize = scale; 
       Bitmap bitmap = BitmapFactory.decodeFile(filePath, o2); 

       imageview.setImageBitmap(bitmap); 
     } 

错误:

01-17 23:18:04.642: D/Documents(25157): onFinished() [content://com.android.providers.media.documents/document/image%3A901] 
01-17 23:18:04.682: E/BitmapFactory(24993): Unable to decode stream: java.lang.NullPointerException 
01-17 23:18:04.682: E/BitmapFactory(24993): Unable to decode stream: java.lang.NullPointerException 
01-17 23:18:09.732: I/InputReader(766): Reconfiguring input devices. changes=0x00000004 
01-17 23:18:09.732: I/InputReader(766): Device reconfigured: id=4, name='touch_dev', size 1080x1920, orientation 3, mode 1, display id 0 
+0

什么问题? – codeMagic

+0

任何图片我选择它不会崩溃的应用程序,但我只是得到这个错误... BitmapFactory无法解码流:java.lang.NullPointerException – Lion789

+0

发布完整的错误日志。似乎是'null' – codeMagic

回答

21

不要以为有一个文件路径。 Android 4.4及更高版本即将删除它们。你得到的这条路已经没有路了。

您仍然可以通过InputStreamContentResolver#openInputStream(Uri uri))或通过文件描述符访问文件内容。

它在这里解释:ContentProviders: Open a document(向下滚动,链接部分似乎被打破)

这确实太工作在较旧的Android版本。

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK && requestCode == 1 && null != data) { 
     decodeUri(data.getData()); 
    } 
} 

public void decodeUri(Uri uri) { 
    ParcelFileDescriptor parcelFD = null; 
    try { 
     parcelFD = getContentResolver().openFileDescriptor(uri, "r"); 
     FileDescriptor imageSource = parcelFD.getFileDescriptor(); 

     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeFileDescriptor(imageSource, null, o); 

     // the new size we want to scale to 
     final int REQUIRED_SIZE = 1024; 

     // Find the correct scale value. It should be the power of 2. 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 1; 
     while (true) { 
      if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) { 
       break; 
      } 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale *= 2; 
     } 

     // decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     Bitmap bitmap = BitmapFactory.decodeFileDescriptor(imageSource, null, o2); 

     imageview.setImageBitmap(bitmap); 

    } catch (FileNotFoundException e) { 
     // handle errors 
    } catch (IOException e) { 
     // handle errors 
    } finally { 
     if (parcelFD != null) 
      try { 
       parcelFD.close(); 
      } catch (IOException e) { 
       // ignored 
      } 
    } 
} 
+0

好的时候,它告诉我要试一试周围的输入?然后初始化input = null?我做错了什么? – Lion789

+1

@ Lion789哎呀,对不起。更新的代码。 – zapl

+0

谢谢,似乎有伎俩 – Lion789

相关问题