选择图像时应用程序崩溃

时间:2015-03-07 06:35:24

标签: android android-intent action

我想问一下,我是在我的应用中从图库中选择一张图片。我曾意图在我的应用中打开图库。这是代码:

public static final int PICK_IMAGE = 1;
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);

当我尝试选择大于1MB的大图像时。它不幸停了下来,否则它的工作正常。有人能告诉我它为什么会发生吗?

3 个答案:

答案 0 :(得分:0)

首先,每当您发布与崩溃相关的问题时,最好发布崩溃日志,以便其他人可以帮助您!

但幸运的是,这是一种非常常见的崩溃形式。它主要是由于Android中的OutOfMemoryException,当你玩大图像时。发生崩溃是因为在Android中你使用有限的内存,并且你正试图在你的应用程序中加载一个大图像。理想情况下,您应该在内存中加载较低分辨率的图像版本。

开发人员网站Displaying Bitmaps Efficiently中有一个特定的部分,请仔细检查一下,看看是否有帮助。

答案 1 :(得分:0)

当您加载大型位图文件时,BitmapFactory类提供了几种解码方法(decodeByteArray(),decodeFile(),decodeResource()等。)。

第1步

在解码时将inJustDecodeBounds属性设置为true可避免内存分配,为位图对象返回null但设置outWidth,outHeight和outMimeType。此技术允许您在构造(和内存分配)位图之前读取图像数据的尺寸和类型。 要避免java.lang.OutOfMemory异常,请在解码之前检查位图的尺寸。 要告诉解码器对图像进行子采样,将较小的版本加载到内存中,请在BitmapFactory.Options对象中将inSampleSize设置为true。

例如,使用inSampleSize为4解码的分辨率为2048x1536的图像会产生大约512x384的位图。将其加载到内存中对于完整图像使用0.75MB而不是12MB。

这是我的代码:

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

        switch (requestCode) {

            case SELECT_PHOTO:
                Uri imageUri;
                try {
                     imageUri = imageReturnedIntent.getData();
                }catch(Exception e){
                    Toast.makeText(getActivity(),"Image Not Found",Toast.LENGTH_SHORT).show();
                    return;
                }
                //final InputStream imageStream = getActivity().getContentResolver().openInputStream(imageUri);
                //final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
                ShrinkBitmapConverter sh = new ShrinkBitmapConverter(getActivity());
                Bitmap selectedImage = null;
                try {
                    selectedImage = sh.shrinkBitmap(imageUri,450,350);
                } catch (Exception e) {
                    Toast.makeText(getActivity(),"Image Not Found",Toast.LENGTH_SHORT).show();
                }
                statusImage = ImageConverter.imageToStringConverter(selectedImage);
                if(statusImage.length()>512000){
                    Toast.makeText(getActivity(),"Image is too big",Toast.LENGTH_LONG).show();
                }else {
                    postImage.setImageBitmap(selectedImage);
                }
        }
    }

ImageConverter.java:

public class ImageConverter {

    public static String imageToStringConverter(Bitmap image){
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteArray = stream.toByteArray();
        String imageToString = Base64.encodeToString(byteArray, Base64.NO_WRAP);
        return imageToString;
    }

    public static Bitmap stringToimageConverter(String imageString){
        byte[] stringTobyte = Base64.decode(imageString, Base64.NO_WRAP);
        Bitmap bmp = BitmapFactory.decodeByteArray(stringTobyte, 0, stringTobyte.length);
        return bmp;
    }

}

ShrinkBitmapConverter.java:

public class ShrinkBitmapConverter {
    Context context;
    public ShrinkBitmapConverter(Context c){
        context=c;
    }

    public Bitmap shrinkBitmap(Uri uri,int width,int height) throws FileNotFoundException {

        BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
        bmpFactoryOptions.inJustDecodeBounds = true;

        Bitmap bitmap = null;;
        try {
            bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri),null,bmpFactoryOptions);

            int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height);
            int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width);

            if (heightRatio > 1 || widthRatio > 1)
            {
                if (heightRatio > widthRatio)
                {
                    bmpFactoryOptions.inSampleSize = heightRatio;
                } else {
                    bmpFactoryOptions.inSampleSize = widthRatio;
                }
            }

            bmpFactoryOptions.inJustDecodeBounds = false;
            bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri),null,bmpFactoryOptions);

        } catch (Exception e) {

            Toast.makeText(context,"Image Not Found",Toast.LENGTH_SHORT).show();
        }

        return bitmap;
    }
}

请阅读此链接了解详情。 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

答案 2 :(得分:0)

只需将此行添加到您在应用程序下的清单中即可。

添加此

android:hardwareAccelerated =“ false” android:largeHeap =“ true”