从图库(SD 卡)中选择图像用于我的应用程序时发生异常... java.lang.OutOfMemoryError:位图大小超出 VM 预算

2024-01-19

我正在使用 Android 在我的应用程序上选择图像,我不知道为什么,有时我会遇到例外,我认为我总是选择超过 400 或 500 kb 的图像,但我不确定。为什么?因为当我选择 100 kb 的小图像时,我没有遇到异常,而当我获取高 KB 或 MB 的图像时,它会崩溃java.lang.OutOfMemoryError: bitmap size exceeds VM budget. 但非常重要:它在模拟器上崩溃,但也在我的手机上崩溃,这不是模拟器的故障。

这是我的代码:

changeImageButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                startActivityForResult(i, ACTIVITY_SELECT_IMAGE);
            }
        }); 



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

        switch(requestCode) {
        case 1:
        {
            setResult(1);
            finish();    
        }
        case ACTIVITY_SELECT_IMAGE:
            if(resultCode == RESULT_OK){  
                Uri selectedImage = imageReturnedIntent.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

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

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

                selectedPhoto = BitmapFactory.decodeFile(filePath);
                //profileImage.setImageBitmap(selectedPhoto);
                profileImage.setImageBitmap(Bitmap.createScaledBitmap(selectedPhoto, 80, 80, false));
            }
        }
    }

profileImage 是我的布局的 ImageView。我使用缩放的 butmap 将图像调整为 80x80

请给我一些有关此异常的帮助,我需要解决它

这是例外:

 01-31 12:38:37.531: ERROR/AndroidRuntime(1025): Uncaught handler: thread main exiting due to uncaught exception
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:375)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:171)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:196)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at com.GPSLoc.Configuration.onActivityResult(Configuration.java:253)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.Activity.dispatchActivityResult(Activity.java:3595)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3001)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3047)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.access$2300(ActivityThread.java:112)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1721)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.os.Handler.dispatchMessage(Handler.java:99)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.os.Looper.loop(Looper.java:123)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.main(ActivityThread.java:3948)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at java.lang.reflect.Method.invoke(Method.java:521)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at dalvik.system.NativeStart.main(Native Method)

据我研究,Bitmap.createScaledBitmap 方法具有内存消耗最高点并产生该错误,但是,我并不完全确定它。不管怎样,它是JAVA API,你无法深入。

您可以执行下一步:

//create a Drawable with your image as parameter
BitmapDrawable d= new BitmapDrawable(youBitmap);
//define bounds for your drawable       
int left =0;
int top = 0;
int right=80;
int bottom=80;

Rect r = new Rect(left,top,right,bottom);
//set the new bounds to your drawable       
d.setBounds(r);
//set the drawable as view of your image view
profileImage.setImageDrawable(d); 

我还没有测试过这段代码,但它应该可以工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从图库(SD 卡)中选择图像用于我的应用程序时发生异常... java.lang.OutOfMemoryError:位图大小超出 VM 预算 的相关文章

  • 查看寻呼机 - 使用静态变量以编程方式滑动到下一页

    我想在我的 ViewPager 中以编程方式制作幻灯片 我的问题是 滑动事件是由放置在 ViewPager 保存的片段内部的按钮调用的 我知道代码 viewpager setCurrentItem int index 现在我的想法是使 Vi
  • 处理 Android 锁屏上的音量变化?

    我想做的是 能够在 android 4 4 上的锁屏上捕获音量增大 减小按钮操作 Google Cast 设计清单 https developers google com cast docs design checklist sender
  • 添加动态数据时 footable 出现问题

    我需要 jQuery Mobile 方面的一些帮助富表 http css tricks com footable a jquery plugin for responsive data tables 我正在表中动态添加数据 HTML tab
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 编译后从字节代码中删除注释

    我们正在使用一个包含使用 JAXB 注释进行注释的 bean 的库 我们使用这些类的方式完全不依赖于 JAXB 换句话说 我们不需要 JAXB 也不依赖注释 但是 由于注释存在 它们最终会被处理注释的其他类引用 这要求我将 JAXB 捆绑到
  • 维护 HttpUrlConnection 调用之间的会话(Native/Webview)

    让我从我做的开始desire 我想制作一个应用程序part native and part webviews Problem 维护本机和 webview 部分之间的会话 My 处理方法 this 我打算实现一个本机登录 其中我向用户展示两个
  • 我的 Android 设备需要安装哪个驱动程序才能运行我的应用程序?

    我购买了 intex mobile 来在真实设备中测试我的 Android 应用程序 然而 该设备不存在于 OEM USB 驱动程序列表中 android 提供的设备列表中 我检查了 intex 官方网站 但不确定到底需要安装哪个驱动程序
  • Android 谷歌地图 V2 已停止

    我正在尝试构建地图应用程序并关注这个链接 https blog emildesign rhcloud com p 435一步步 我在这里找到了类似的主题 但对我没有帮助 我想显示地图 但是当我运行它时 它返回强制关闭和我的 Android
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 在 Android 中始终以横向模式打开相机

    在我的 Android 应用程序中 单击按钮后我希望相机以横向模式打开 即使我将手机旋转为纵向模式 相机也应始终处于横向模式或纵向模式 使用此代码在横向模式下打开相机 Intent cameraIntent new Intent Media
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • 我应该选择的最低 SDK 版本是多少? (截至2018年11月)

    据我所知 android studio 中默认的最小 SDK 设置是 15 我读到我应该增加它 因为没有多少人 或者可能没有 仍在使用该 android 版本 另外 我计划使用 android studio 中的一些新功能 这些功能仅适用于
  • Android 消费品:“已经拥有该商品”,但 inventory.hasPurchase() 为 false

    我被 Google In App v3 困住了 我测试了一次没有消费的购买 例如 当应用程序在购买和消费之间崩溃时 现在我找不到出路 如果我尝试再次购买 它会显示 您已经拥有该商品 但是当我测试所有权时 它说我不拥有它 Inventory
  • Android - 多次实例化一个片段?

    我正在创建一个在 ListView 中显示数据的应用程序 数据分为两种类型 热门 收藏夹 我有一个活动和两个片段 片段根据类别显示项目列表 我为此使用了 ListView 然后我有两个fragment layouts 它们在设计上完全相同
  • 截图显示黑色

    我正在拍摄快照并创建缩略图 然后共享此图像 但缩略图显示全黑 我使用了以下代码 Bitmap bitmap View v1 v getRootView v1 setDrawingCacheEnabled true bitmap Bitmap
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • Android 4.2 - Environment.getExternalStorageDirectory().getPath() 行为

    我一直在开发一个android应用程序 在上次更新到4 2之前 我使用 Environment getExternalStorageDirectory getPath 它返回了我 storage sdcard0 但自从更新后我现在得到了 s
  • 如何通过 AppCompatActivity 使用 YouTube Android 播放器 API

    为了在我的应用程序中播放视频 我决定扩展 YouTube Android Player API 但问题是我的菜单消失了 因为我没有从 AppCompatActivity 扩展 问题是 如何使用 YouTube Android Player
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case

随机推荐