Intent如何图片传输限制(TransactionTooLargeException )

40 篇文章 0 订阅
18 篇文章 0 订阅

通过 Intent 传递数据时,Android 平台对传输的数据大小有严格限制,通常限制在 1MB 左右。如果尝试传递过大的数据(例如大图片),可能会导致 TransactionTooLargeException 异常。因此,不建议直接通过 Intent 的 extras 传递大图片。

但是,如果你确实需要在不同的 Activity 或服务之间传递大图片,可以考虑以下替代方法:

方法一:通过文件共享传递文件路径

  1. 将图片保存到共享存储:将图片保存到应用的内部存储或外部存储中,例如使用 getExternalFilesDir()
  2. 通过 Intent 传递文件路径:在 Intent 的 extras 中传递图片文件的路径。
  3. 目标 Activity 读取图片:目标 Activity 从文件路径中读取图片。

代码示例

发送 Activity

File imageFile = new File(getExternalFilesDir(null), "shared_image.jpg");
// 将图片保存到 imageFile
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("image_path", imageFile.getAbsolutePath());
startActivity(intent);

接收 Activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);

    String imagePath = getIntent().getStringExtra("image_path");
    if (imagePath != null) {
        File imageFile = new File(imagePath);
        if (imageFile.exists()) {
            Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
            ImageView imageView = findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        }
    }
}

方法二:使用 ContentProvider 传递 URI

  1. 实现一个 ContentProvider:在提供方应用中实现一个 ContentProvider 来共享图片数据。
  2. 通过 Intent 传递 URI:在 Intent 的 extras 中传递图片的 URI。
  3. 目标 Activity 通过 URI 访问图片:目标 Activity 通过 ContentResolver 访问图片数据。

代码示例

ContentProvider

public class ImageProvider extends ContentProvider {
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // 保存图片并返回 URI
        return uri;
    }

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
        File file = new File(getContext().getFilesDir(), "shared_image.jpg");
        return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
    }
}

发送 Activity

Uri imageUri = getContentResolver().insert(IMAGE_CONTENT_URI, contentValues);
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("image_uri", imageUri.toString());
startActivity(intent);

接收 Activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);

    String imageUriString = getIntent().getStringExtra("image_uri");
    if (imageUriString != null) {
        Uri imageUri = Uri.parse(imageUriString);
        try (InputStream inputStream = getContentResolver().openInputStream(imageUri)) {
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            ImageView imageView = findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

方法三:使用 Bitmap 的压缩格式

如果图片不是特别大,可以考虑压缩图片然后传递压缩后的数据:

发送 Activity

Bitmap bitmap = ...; // 获取图片的 Bitmap 对象
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream); // 压缩图片
byte[] byteArray = stream.toByteArray();

Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("image_data", byteArray);
startActivity(intent);

接收 Activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);

    byte[] byteArray = getIntent().getByteArrayExtra("image_data");
    if (byteArray != null) {
        Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
        ImageView imageView = findViewById(R.id.imageView);
        imageView.setImageBitmap(bitmap);
    }
}

这三种方法可以帮助你避免直接通过 Intent 传递大图片所带来的问题,推荐根据实际需求选择合适的方法。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬_小彬

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值