将位图传递给另一个活动以RunTimeException结束



我正试图将位图传递给另一个活动,并且我正在使用ImageView显示来自其他活动的相同图像。这就是我传递位图的方式

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == CAMERA_RESULT) {
        File out = new File(getFilesDir(), "newImage.jpg");
        if(!out.exists()) {
            Toast.makeText(getBaseContext(),
                    "Error while capturing image", Toast.LENGTH_LONG)
                    .show();
            return;
        }
        Bitmap mBitmap = BitmapFactory.decodeFile(out.getAbsolutePath());
        Intent bitIntent = new Intent(this, CameraTake.class);
        bitIntent.putExtra("BitmapImage", mBitmap);
        startActivity(bitIntent);

我是这样接收这个值的:

 Intent intent = getIntent();
    bitmap= (Bitmap)intent.getParcelableExtra("BitmapImage");
    ImageView im1 = (ImageView)findViewById(R.id.camOut);
    im1.setImageBitmap(bitmap);

当运行应用程序时,这里是我获得的logcat:

> 10-17 08:32:11.241  16762-16762/obx.com.futurister E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: obx.com.futurister, PID: 16762
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent {  }} to activity {obx.com.futurister/obx.com.futurister.OptionChooser}: java.lang.RuntimeException: Failure from system
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
            at android.app.ActivityThread.-wrap16(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.RuntimeException: Failure from system
            at android.app.Instrumentation.execStartActivity(Instrumentation.java:1514)
            at android.app.Activity.startActivityForResult(Activity.java:3917)
            at android.app.Activity.startActivityForResult(Activity.java:3877)
            at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:820)
            at android.app.Activity.startActivity(Activity.java:4200)
            at android.app.Activity.startActivity(Activity.java:4168)
            at obx.com.futurister.OptionChooser.onActivityResult(OptionChooser.java:75)
            at android.app.Activity.dispatchActivityResult(Activity.java:6428)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
            at android.app.ActivityThread.-wrap16(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: android.os.TransactionTooLargeException: data parcel size 4915644 bytes
            at android.os.BinderProxy.transactNative(Native Method)
            at android.os.BinderProxy.transact(Binder.java:503)
            at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2657)
            at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
            at android.app.Activity.startActivityForResult(Activity.java:3917)
            at android.app.Activity.startActivityForResult(Activity.java:3877)
            at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:820)
            at android.app.Activity.startActivity(Activity.java:4200)
            at android.app.Activity.startActivity(Activity.java:4168)
            at obx.com.futurister.OptionChooser.onActivityResult(OptionChooser.java:75)
            at android.app.Activity.dispatchActivityResult(Activity.java:6428)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
            at android.app.ActivityThread.-wrap16(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

在一个类似的问题,解决方案建议使用图像加载库,我应该去,或者这可以很容易地修复?寻找专业的答案。由于

日志中已经提供了根本原因:

原因:android.os.TransactionTooLargeException:数据包大小4915644字节

Intent传输数据的最大上限是1mb,所以有几种方法可以传递位图:

  1. 减小位图大小,这可能是一个有效的解决方案,也可能不是,这取决于你的用例。
  2. 将位图切碎以供传输,并在接收端重新组装,您可能需要为其编写服务,而且效率并不高。做过一次,不推荐。
  3. 仅传递位图的URI,并在接收活动上重新加载它。这就是意图要求Android相机应用程序拍摄照片的工作原理-照片被保存到存储中,只有存储文件的URI被返回。
  4. 如果第一和第二活动在同一进程中,你可以跳过以上所有并将位图保存到共享缓存中,那里有很多很多库可以完成。

如果您可以捕获图像并保存到本地存储:

File out = new File(getFilesDir(), "newImage.jpg");

你应该通过以下方式传递out的路径给其他活动:

bitIntent.putExtra("BitmapImage", out.getAbsolutePath());

代替bitIntent.putExtra("BitmapImage", mBitmap);

And in secondActivity:

Intent intent = getIntent();
String imagePath = intent.getStringExtra("BitmapImage");
File imgFile = new  File(imagePath);
if(imgFile.exists()){
    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    ImageView myImage = (ImageView) findViewById(R.id.camOut);
    myImage.setImageBitmap(myBitmap);
}

我们不能通过intent extra传递Bitmap。原因是Inner Process Communication (IPC)总线有1mb的限制。此限制适用于表示Intent的附加

Bundle

最新更新