BitmapFactory Unable to decode stream

匿名 (未验证) 提交于 2019-12-03 02:20:02

问题:

Hey I am not sure why this keeps coming up every time I select an image in my gallery?

Here is the code:

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

Error:

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 

回答1:

Don't assume that there is a file path. Android 4.4 and up are about to remove them. And the uri you got has already no path.

You can still access the file content either through an InputStream (ContentResolver#openInputStream(Uri uri)) or through a file descriptor.

It's explained here: ContentProviders: Open a document (scroll down, link to section seems to be broken)

And that does work on older android versions too.

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!