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

Android 将位图传递给另一个活动以RunTimeException结束,android,bitmap,Android,Bitmap,我试图将位图传递给另一个活动,并使用ImageView显示来自另一个活动的相同图像。这就是我传递位图的方式 protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (resultCode

我试图将位图传递给另一个活动,并使用
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);
运行应用程序时,我得到的日志如下:

> 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数据传输的最大上限为1 MB,因此有几种方法可以传递位图:

  • 减小位图大小,这可能是有效的解决方案,也可能不是,具体取决于您的使用情况
  • 将位图切碎以便运输,然后在接收端重新组装,您可能需要为其编写一个新的位图,但效率不太高。做过一次,不推荐
  • 仅传递位图的URI,并在接收活动上重新加载它。这就是要求Android摄像头应用程序拍照的方式——照片保存到存储器中,只返回存储文件的URI
  • 如果第一个和第二个活动在同一个过程中,您可以跳过以上所有操作,并将位图保存到共享缓存中,在共享缓存中有许多库可以完成此操作

  • 我们无法通过intent extras传递
    位图。原因是
    内部进程通信(IPC)
    总线有1mb限制。如果您可以通过以下方式捕获图像并保存到本地存储,则此限制适用于表示
    意图的
    捆绑包

    File out = new File(getFilesDir(), "newImage.jpg");
    
    您应该通过以下方式将
    out
    的路径传递给其他活动:

    bitIntent.putExtra("BitmapImage", out.getAbsolutePath());
    
    而不是
    bitinent.putExtra(“BitmapImage”,mBitmap)

    在第二项活动中:

    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);
    }
    

    我认为你应该通过图像的路径,不应该通过图像!我用这个:来捕获图像,你能帮我识别路径吗?:你在本地存储器中得到图像了吗?使用
    bitinent.putExtra(“BitmapImage”,out.getAbsolutePath())而不是
    bitinent.putExtra(“位图图像”,mBitmap)。在新活动中,您将从路径获取并加载图像!你能解释一下吗:)?
    原因是:android.os.TransactionTooLargeException:数据包大小4915644字节
    你的位图太大,无法放入事务中。将其放入文件并传递路径感谢您找到错误原因:)。现在的问题是,我可以通过将URI传递给另一个活动来解决这个问题吗?@oblivion只要这两个活动在位图的传递方式中同步,它就会起作用。谢谢,今天在使用Intent不传递时学会了:)对我来说,这是在我通过bundle发送到下一个片段的数据丢失时发生的。我意识到这可能导致这个问题随机出现。你也可以在第一个类中创建一个getter,让第二个类以这种方式访问它。这就是我们迁移到android 7时要做的事情。