Java Android:setImageBitmap在我的应用程序收到来自Intent的高分辨率图像时失败
我有个问题。我编写了一个应用程序来选择图像并将其传递给另一个活动,并将其显示在第二个活动的屏幕上。然而,我发现我的应用程序在收到高分辨率图像后崩溃。我在测试中发送了一个1440x810图像(大小为166KB) 下面是我的代码: 第一项活动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
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错误”正确吗?如果没有,请张贴您的日志。