将上传的大图像发送到下一个活动时,应用程序崩溃

时间:2018-01-30 00:03:32

标签: java android

我通过谷歌甚至YouTube搜索视频。代码在上传和显示大图像时效果很好,但在将其发送到下一个活动时会崩溃。我尝试过质量或尺寸较小的图像,效果很好

fprintf(out_file, "%s %d %d %d", header.MAGIC_NUMBER,header.HEIGHT,header.WIDTH,header.MAX_COLOR);

这是显示从 MainActivity.java 发送的图像的位置:

let ref = firebase.database().ref('players').child(playerId).child('voters');

ref.child(uid).once('value', snap => {
  if (snap.exists) {
    // a vote has already been recorded
  } else {
    // there is not already a vote there
  }
});

以下是错误消息:

public class MainActivity extends AppCompatActivity {
    private static final int PICK_IMAGE_REQUEST = 123;
    public static Bitmap bitmap;
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.img);
    }

    public void upload(View view) {
        Intent intent = new Intent();
        // Show only images, no videos or anything else
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        // Always show the chooser (if there are multiple options available)
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);

    }

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

        if (resultCode == Activity.RESULT_OK)
            switch (requestCode) {
                case PICK_IMAGE_REQUEST:

                    Uri filePath = data.getData();
                    try {
                        bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                        imageView.setImageBitmap(bitmap);

                    } catch (IOException e) {
                        Log.i("TAG", "Some exception" + e);
                    }
                    break;
            }
    }


    public void Submit(View view) {     
        Intent intent = new Intent(getApplicationContext(), Main2Activity.class);
        if(bitmap !=null) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 40, stream);
            byte[] byteArray = stream.toByteArray();

            intent.putExtra("bitmap", byteArray);
        }
        startActivity(intent);
    }
}

4 个答案:

答案 0 :(得分:1)

您无法通过documentation

中的意图发送大图片
  

通过意图发送数据时,应该小心限制   数据大小为几KB。发送太多数据可能会导致系统崩溃   抛出TransactionTooLargeException异常。

所以,如果你发送 Uri 并在接收器Activity中处理Uri会更好。

首先,您需要在第一个活动中发送Uri而不是Bitmap:

private Uri mFileUri;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if (resultCode == Activity.RESULT_OK)
     switch (requestCode) {
       case PICK_IMAGE_REQUEST:
         // Save uri for submit process.
         mFileUri = data.getData();
         ...
         break;
     }
}

public void Submit(View view) {
  Intent intent = new Intent(this, Main2Activity.class);
  intent.setData(mFileUri);
  startActivity(intent);
}

然后在接收器活动中处理它:

public class Main2Activity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    ImageView img = (ImageView) findViewById(R.id.imgg);

    // get the fileUri from the intent
    Uri fileUri = getIntent().getData();

    try {
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
      img.setImageBitmap(bitmap);
    } catch (IndexOutOfBoundsException e){
      // handle the exception.
    }
  }
}

答案 1 :(得分:0)

答案很简单。将映像存储在设备文件存储中,将存储中映像的Uri传递给正在启动另一个活动的Intent,然后从该intent获取Uri,并从该文件加载。

答案 2 :(得分:0)

Bitmap中的MainActivity对象被标记为静态,我怀疑为什么这是必要的 将其设置为静态会使Android在启动Main2Activity时无法使用GC 你内存不足的一个潜在原因。

尝试将其更改为private Bitmap bitmap可能解决您的问题。

但通常在活动上传递位图对象很少见 由于您提到图片已上传,因此在上传图片后,最好从服务器获取图片网址,然后使用某些图片库(例如GlideFresco)从互联网。

答案 3 :(得分:0)

此:

bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);

这条线很难耗尽内存。现在你有图像的URI吗?

Uri filePath = data.getData();

现在使用Picasso加载如下图像 1.如果您想将图像发送到其他地方:

com.squareup.picasso.Target mTarget = new com.squareup.picasso.Target() {
                        @Override
                        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                            imageView.setImageBitmap(bitmap);
                            

                        @Override
                        public void onBitmapFailed(Drawable errorDrawable) {

                        }

                        @Override
                        public void onPrepareLoad(Drawable placeHolderDrawable) {

                        }
                    };
                    
                    Picasso.with(mContext).load(filePath).into(mTarget);

  1. 如果您想以较低质量使用图像,请执行以下操作:
  2. Picasso.with(mContext).load(filePath).centerInside().resize(YourWidth,YourHeight).into(imageview);