访问SD卡图像

时间:2011-10-20 05:57:00

标签: android bitmap sd-card

我正在开发一个Android应用程序,我必须将图像从SD卡上传到互联网。为此我使用 MediaStore 内容提供商并从 MediaStore.Images.Media.DATA 列获取图像路径,现在我正在做的是创建位图使用 Bitmap.decodeFile(String path)方法从该路径开始,然后在列表中的 ImageView 中显示该位图。我面临的问题是,当我尝试进入列表中显示此图像的活动时,我收到如下错误 10-20 11:10:47.070:ERROR / AndroidRuntime(922):java.lang .OutOfMemoryError:位图大小超过VM预算

任何人都可以建议我解决这个问题,或者另一种方法来实现我的目标。提前谢谢。

3 个答案:

答案 0 :(得分:1)

这种情况很多时候会导致存储在SD卡中的图像具有高分辨率,并且您的应用无法将图像大小处理成堆大小

使用以下行获取位图

Bitmap bmp = Bitmap.decodeFile(String path) 

您应尝试将缩小到所需的尺寸

newBmp = Bitmap.createScaledBitmap(bmp, 240, 320, true);

然后使用newBmp在您的视图中进行设置。

答案 1 :(得分:1)

下面的代码用于调整所选图像的大小

Bitmap bitmap  = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()); 
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int newWidth = 100;
            int newHeight = 100;

            // calculate the scale - in this case = 0.4f
            float scaleWidth = ((float) newWidth) / width;
            float scaleHeight = ((float) newHeight) / height;

            // createa matrix for the manipulation
            Matrix matrix = new Matrix();
            // resize the bit map
            matrix.postScale(scaleWidth, scaleHeight);

            Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, 
                    width, height, matrix, true); 

            ((ImageView) findViewById(R.id.ImageviewTest)).setImageBitmap(resizedBitmap);

答案 2 :(得分:0)

String filepath = Environment.getExternalStorageDirectory()
            .getAbsolutePath();
    File file = new File(filepath, filename);
    FileInputStream fs;
    try {
        fs = new FileInputStream(file);
        BitmapFactory.Options bfOptions = new BitmapFactory.Options();
        /*
         * bfOptions.inDither=false; //Disable Dithering mode
         * bfOptions.inPurgeable=true; //Tell to gc that whether it needs
         * free memory, the Bitmap can be cleared
         * bfOptions.inInputShareable=true;
         */
        bfOptions.inJustDecodeBounds = false;
        bfOptions.inTempStorage = new byte[32 * 1024];
        Bitmap b = BitmapFactory.decodeFileDescriptor(fs.getFD(), null,
                bfOptions);
        img.setImageBitmap(b);
}
catch()
{
}