Java Android:setImageBitmap在我的应用程序收到来自Intent的高分辨率图像时失败

Java Android:setImageBitmap在我的应用程序收到来自Intent的高分辨率图像时失败,java,android,android-intent,android-activity,bitmapimage,Java,Android,Android Intent,Android Activity,Bitmapimage,我有个问题。我编写了一个应用程序来选择图像并将其传递给另一个活动,并将其显示在第二个活动的屏幕上。然而,我发现我的应用程序在收到高分辨率图像后崩溃。我在测试中发送了一个1440x810图像(大小为166KB) 下面是我的代码: 第一项活动 public class MainActivity extends ActionBarActivity { private Button button; private Intent intent ; public final static String EX

我有个问题。我编写了一个应用程序来选择图像并将其传递给另一个活动,并将其显示在第二个活动的屏幕上。然而,我发现我的应用程序在收到高分辨率图像后崩溃。我在测试中发送了一个1440x810图像(大小为166KB)

下面是我的代码:

第一项活动

public class MainActivity extends ActionBarActivity {
private Button button;
private Intent intent ;
public final static String EXTRA_BITMAP_BYTE_STREAM = "EXTRA_BITMAP_BYTE_STREAM";
private static final int PICK_IMAGE = 1;
private String imageFilePath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.button);
    setActionListener();
    Intent getImgIntent = new Intent();
    getImgIntent .setType("image/*");
    getImgIntent .setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(getImgIntent , "Select Picture"), PICK_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == PICK_IMAGE && data != null && data.getData() != null) {
        Uri _uri = data.getData();
        //User had pick an image.
        Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null);
        cursor.moveToFirst();
        //Link to the image
        imageFilePath = cursor.getString(0);
        cursor.close();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

private void setActionListener(){
     button.setOnClickListener(new OnClickListener() {  
        @Override  
        public void onClick(View v) { 
            Bitmap  resImage;
            ByteArrayOutputStream outImageByteArrayOutputStream = new ByteArrayOutputStream(); 
            byte [] outImageByteArray;

            intent = new Intent(MainActivity.this,SecMainActivity.class);
            File file = new File(imageFilePath); 
            resImage = BitmapFactory.decodeFile(imageFilePath);
            resImage.compress(Bitmap.CompressFormat.JPEG,100,outImageByteArrayOutputStream);
            outImageByteArray =  outImageByteArrayOutputStream.toByteArray();

            intent.putExtra(EXTRA_BITMAP_BYTE_STREAM, outImageByteArray);
            startActivity(intent);
        }
     });
}
}
第二项活动

public class SecMainActivity extends ActionBarActivity {
private Button returnButton;
private ImageView receivedImageView;
Intent intent;
Thread handleBitmapImage;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sec_main);
    findViews();
    handleReceivedInfoToUI();
    setActionListener();
}

@Override
protected void onStart(){
    super.onStart();
    handleBitmapImage.start();

}
private void findViews(){
    returnButton = (Button) findViewById(R.id.returnButton);
    receivedImageView = (ImageView) findViewById(R.id.receivedImageView);       
}

private void handleReceivedInfoToUI(){
    intent = getIntent();
    handleBitmapImage = new Thread(new Runnable(){
            @Override
            public void run(){
                byte [] receivedImageByteArray = intent.getByteArrayExtra(MainActivity.EXTRA_BITMAP_BYTE_STREAM);
                final Bitmap bmp = BitmapFactory.decodeByteArray(receivedImageByteArray, 0, receivedImageByteArray.length);

                runOnUiThread(new Runnable(){
                    @Override
                    public void run(){
                        setReceivedImage(bmp);
                    }
                });
            }   
            });

}

private void setActionListener(){
    returnButton.setOnClickListener( new OnClickListener(){
        @Override
        public void onClick(View v){
            finish();
        }
    });
}

public void setReceivedImage(Bitmap bmp){
    receivedImageView.setImageBitmap(bmp);
}
}

我是否必须压缩并调整接收到的图像以解决此问题?

如果您通过位图宽度和高度,则使用下面的函数

    public Bitmap getResizedBitmap(Bitmap image, int bitmapWidth,
            int bitmapHeight) {
        return Bitmap.createScaledBitmap(image, bitmapWidth, bitmapHeight,
                true);
    } 
如果希望位图比例相同,请减小位图大小。然后传递最大大小的位图。你可以使用这个功能

public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
    int width = image.getWidth();
    int height = image.getHeight();

    float bitmapRatio = (float)width / (float) height;
    if (bitmapRatio > 0) {
        width = maxSize;
        height = (int) (width / bitmapRatio);
    } else {
        height = maxSize;
        width = (int) (height * bitmapRatio);
    }
    return Bitmap.createScaledBitmap(image, width, height, true);
}

我猜您的“outOfMemory错误”正确吗?如果没有,请张贴您的日志。