java.lang.OutOfMemoryError在Android的同时获得图像从画廊的android画廊、图像、lang、java

2023-09-05 10:54:11 作者:一吼二怒三切腹

我是从画廊使用code采摘的图片

 公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.gallery);

        意图I =新的意图(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        startActivityForResult(ⅰ,SELECT_PICTURE);
    }


    公共无效onActivityResult(INT申请code,INT结果code,意图数据){
        如果(要求code == SELECT_PICTURE和放大器;&安培;结果code == RESULT_OK和放大器;&安培;!NULL =数据){
            乌里selectedImage = data.getData();
            的String [] filePathColumn = {MediaStore.Images.Media.DATA};

            光标光标= getContentResolver()查询(selectedImage,filePathColumn,NULL,NULL,NULL);
            cursor.moveToFirst();

            INT参数:columnIndex = cursor.getColumnIndex(filePathColumn [0]);
            picturePath = cursor.getString(参数:columnIndex);
            cursor.close();

            Log.v(picturePath,picturePath:+ picturePath);
            点阵位图= BitmapFactory.de codeFILE(picturePath);

            意图int​​entUpload =新的意图(GalleryActivity.this,UploadActivity.class);
            // intentUpload.putExtra(BitmapImage的,位图);
            MyApplicationGlobal.bitmap =位图;
            startActivity(intentUpload);
            完();
        }
    }


公共字符串getPath(URI URI){
        的String []投影= {MediaStore.Images.Media.DATA};
        光标光标= managedQuery(URI,投影,NULL,NULL,NULL);
        INT与Column_Index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        返回cursor.getString(Column_Index中);
    }
 

但我发现了错误。

 致命异常:主要
 java.lang.OutOfMemoryError
在android.graphics.BitmapFactory.nativeDe codeStream(本机方法)
在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:493)
在android.graphics.BitmapFactory.de codeFILE(BitmapFactory.java:299)
在android.graphics.BitmapFactory.de codeFILE(BitmapFactory.java:324)
在com.markphoto_activities.GalleryActivity.onActivityResult(GalleryActivity.java:59)
在android.app.Activity.dispatchActivityResult(Activity.java:4541)
在android.app.ActivityThread.deliverResults(ActivityThread.java:2740)
在android.app.ActivityThread.handleSendResult(ActivityThread.java:2787)
在android.app.ActivityThread.access $ 2000(ActivityThread.java:122)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1032)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:132)
在android.app.ActivityThread.main(ActivityThread.java:4025)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:491)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:841)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
在dalvik.system.NativeStart.main(本机方法)
 

登入猫

 :E / dalvikvm堆(2487):内存在17915920字节分配。
主PRIO = 5 TID = 1 RUNNABLE
|组=主SCOUNT = 0 dsCount = 0的obj = 0x400d5638自我= 0x126c8
| sysTid = 2487漂亮= 0 sched的= 0/0 CGRP =默认的手柄= -1342909336
| schedstat =(2650512000 283442000 1204)UTM = 226 STM = 39核心= 1
在android.graphics.BitmapFactory.nativeDe codeStream(本机方法)
在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:493)
在android.graphics.BitmapFactory.de codeFILE(BitmapFactory.java:299)
在android.graphics.BitmapFactory.de codeFILE(BitmapFactory.java:324)
在com.markphoto_activities.GalleryActivity.onActivityResult(GalleryActivity.java:59)
在android.app.Activity.dispatchActivityResult(Activity.java:4541)
在android.app.ActivityThread.deliverResults(ActivityThread.java:2740)
在android.app.ActivityThread.handleSendResult(ActivityThread.java:2787)
在android.app.ActivityThread.access $ 2000(ActivityThread.java:122)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1032)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:132)
在android.app.ActivityThread.main(ActivityThread.java:4025)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:491)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:841)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
在dalvik.system.NativeStart.main(本机方法)
:D / Skia的(2487):libjpeg的错误105℃; SS =%D,硒=%D,阿=%D,AL =%d取代;从allocPixelRef [3456 2592]
  :D / Skia的(2487):---德codeR->德code返回false
  :D / AndroidRuntime(2487):关闭虚拟机
 
Java基础篇 异常详解

解决方案

试试这个:

  @覆盖
    保护无效onActivityResult(INT申请code,INT结果code,
            意图imageReturnedIntent){
        super.onActivityResult(要求code,因此code,imageReturnedIntent);

        开关(要求code){
        案例SELECT_PHOTO:
            如果(结果code == RESULT_OK){
                乌里selectedImage = imageReturnedIntent.getData();
                尝试 {
                    picImageView.setImageBitmap(德codeURI(selectedImage));
                }赶上(FileNotFoundException异常E){
                    e.printStackTrace();
                }
            }
        }
    }
 

然后声明如下功能:

 私人位图德codeURI(URI selectedImage)抛出FileNotFoundException异常{
        BitmapFactory.Options O =新BitmapFactory.Options();
        o.inJustDe codeBounds = TRUE;
        BitmapFactory.de codeStream(
                。getContentResolver()openInputStream(selectedImage),空,O);

        最终诠释REQUIRED_SIZE = 100;

        INT width_tmp = o.outWidth,height_tmp = o.outHeight;
        int标= 1;
        而(真){
            如果(width_tmp / 2'; REQUIRED_SIZE || height_tmp / 2'; REQUIRED_SIZE){
                打破;
            }
            width_tmp / = 2;
            height_tmp / = 2;
            规模* = 2;
        }

        BitmapFactory.Options O2 =新BitmapFactory.Options();
        o2.inSampleSize =规模;
        返回BitmapFactory.de codeStream(
                getContentResolver()openInputStream(selectedImage),空,O2)。
    }
 

感谢。

I am picking a picture from gallery using code

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallery);

        Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        startActivityForResult(i, SELECT_PICTURE);
    }


    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

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

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            picturePath = cursor.getString(columnIndex);
            cursor.close();

            Log.v("picturePath", "picturePath: " + picturePath);
            Bitmap bitmap = BitmapFactory.decodeFile(picturePath);

            Intent intentUpload = new Intent(GalleryActivity.this, UploadActivity.class);
            // intentUpload.putExtra("BitmapImage", bitmap);
            MyApplicationGlobal.bitmap = bitmap;
            startActivity(intentUpload);
            finish();
        }
    }


public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

But I'm getting error

 FATAL EXCEPTION: main
 java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)
at com.markphoto_activities.GalleryActivity.onActivityResult(GalleryActivity.java:59)
at android.app.Activity.dispatchActivityResult(Activity.java:4541)
at android.app.ActivityThread.deliverResults(ActivityThread.java:2740)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:2787)
at android.app.ActivityThread.access$2000(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1032)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)

Log-cat is

: E/dalvikvm-heap(2487): Out of memory on a 17915920-byte allocation.
"main" prio=5 tid=1 RUNNABLE
| group="main" sCount=0 dsCount=0 obj=0x400d5638 self=0x126c8
| sysTid=2487 nice=0 sched=0/0 cgrp=default handle=-1342909336
| schedstat=( 2650512000 283442000 1204 ) utm=226 stm=39 core=1
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)
at com.markphoto_activities.GalleryActivity.onActivityResult(GalleryActivity.java:59)
at android.app.Activity.dispatchActivityResult(Activity.java:4541)
at android.app.ActivityThread.deliverResults(ActivityThread.java:2740)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:2787)
at android.app.ActivityThread.access$2000(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1032)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
: D/skia(2487): libjpeg error 105 <  Ss=%d, Se=%d, Ah=%d, Al=%d> from allocPixelRef [3456   2592]
  : D/skia(2487): --- decoder->decode returned false
  : D/AndroidRuntime(2487): Shutting down VM

解决方案

Try this :

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

        switch (requestCode) {
        case SELECT_PHOTO:
            if (resultCode == RESULT_OK) {
                Uri selectedImage = imageReturnedIntent.getData();
                try {
                    picImageView.setImageBitmap(decodeUri(selectedImage));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

And then declare the following function :

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(
                getContentResolver().openInputStream(selectedImage), null, o);

        final int REQUIRED_SIZE = 100;

        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(
                getContentResolver().openInputStream(selectedImage), null, o2);
    }

Thanks.