【问题标题】:In ImageView doesn't show picture from gallery在 ImageView 中不显示图库中的图片
【发布时间】:2017-05-18 11:42:46
【问题描述】:

我尝试从应用程序的图库中获取图像并将其放入 ImageView,但出现错误“OutOfMemoryError”

FATAL EXCEPTION: main
 java.lang.OutOfMemoryError
 at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:695)
 at kz.app.discount.activities.AddingProduct.onActivityResult(AddingProduct.java:374)
 at android.app.Activity.dispatchActivityResult(Activity.java:5456)
 at android.app.ActivityThread.deliverResults(ActivityThread.java:3402)
 at android.app.ActivityThread.handleSendResult(ActivityThread.java:3449)
 at android.app.ActivityThread.access$1200(ActivityThread.java:150)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1328)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:137)
 at android.app.ActivityThread.main(ActivityThread.java:5279)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:511)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
 at dalvik.system.NativeStart.main(Native Method)`

使用 Intent.ACTION_PICK 和 onActivityResult() 从图库中获取图像的代码:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {

        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

        Bitmap bitmap = null;
        ImageView imageView = iVAddProductDiscountPicture;

        switch (requestCode) {
            case GALLERY_REQUEST:
                if (resultCode == RESULT_OK) {
                    Uri selectedImage = imageReturnedIntent.getData();
                    try {
                        bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage);
                        final ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 10, stream);
                        Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(stream.toByteArray()));
                        //TODO: дописать код сжатия изображения
                        imageView.setImageBitmap(decoded);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    alertDialog.dismiss();

                }
        }
    }

【问题讨论】:

  • OutOfMemoryError 表示图像太大,您的设备无法处理。加载它已经缩放。
  • @MichaelDodd,文件大小无关紧要,只有分辨率才重要。
  • @Wladimir Rudnicky 请将位图压缩大小从 10 增加到 100 并尝试 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
  • 如果你摆脱完全没有意义的ByteArrayOutputStream,重新编码,重新解码图像,你会有更好的运气。您所做的只是浪费堆空间并降低图像质量。然而,即便如此,根据图像分辨率和堆的状态,您可能没有足够的堆空间。

标签: android imageview bitmapfactory


【解决方案1】:

试试这个:

  public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
            selectedImageUri =data.getData();
                Log.d("uri:----",""+selectedImageUri);
     if (null != selectedImageUri) {
                imgView.setImageURI(selectedImageUri);
            }
        }
    }

【讨论】:

    【解决方案2】:

    在 onCreate() 中

    imgProfile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent gallary = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(gallary,LOAD_IMG);
            }
        });
    

    onCreate() 之外

        @Override
         protected  void onActivityResult(int requestCode,int resultCode,Intent data){
        super.onActivityResult(requestCode,resultCode,data);
    
        try{
            if(requestCode==LOAD_IMG && resultCode==RESULT_OK && data!=null){
    
                Uri selectedImage = data.getData();
                String []filePath = {MediaStore.Images.Media.DATA};
    
                Cursor cursor = getContentResolver().query(selectedImage,filePath,null,null,null);
                cursor.moveToFirst();
    
                int columnIndex = cursor.getColumnIndex(filePath[0]);
                String imgDecodableString = cursor.getString(columnIndex);
                cursor.close();
    
                imgProfile.setImageBitmap(BitmapFactory.decodeFile(imgDecodableString));
    
            }else{
                Toast.makeText(this, "Please select image", Toast.LENGTH_LONG).show();
            }
        }catch (Exception e){
            Toast.makeText(this, "error", Toast.LENGTH_LONG).show();
        }
    }
    

    【讨论】:

    • 我试过这个。图像视图得到空图像,但我没有收到错误 - 进度
    • 详细说明,这是如何处理OutOfMemoryError的。
    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多