Подтвердить что ты не робот

Передача Bitmap в другую активность заканчивается в RunTimeException

Я пытаюсь передать Bitmap в другую активность, и я показываю то же изображение из другого действия, используя 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)

В аналогичном question решение рекомендует использовать библиотеки загрузки изображений, следует ли мне пойти на это, или это можно легко устранить? Ищете профессиональные ответы. Благодаря

4b9b3361

Ответ 1

Основная причина была указана в журнале:

Вызывает: android.os.TransactionTooLargeException: размер пакета данных 4915644 байт

Максимальная пропускная способность для передачи данных Intent составляет 1 МБ, поэтому есть несколько способов передать растровое изображение:

  • Уменьшить размер растрового изображения, это может быть или не быть допустимым решением в зависимости от вашего варианта использования.
  • Разбиваем растровое изображение для транспортировки и собираем его на приемной стороне, вам, вероятно, потребуется написать service, и это не очень эффективно, Один раз, не рекомендуется.
  • Только передача URI для растрового изображения и загрузка его заново в принимающей операции. Вот как работает Intent, предлагающее приложение для камеры Android делать снимок - изображение сохраняется в хранилище и возвращается только URI сохраненного файла.
  • Если 1-й и 2-й действия находятся в одном и том же процессе, вы можете пропустить все вышеперечисленное и сохранить растровое изображение в общий кэш, где для этого есть много и многих библиотек.

Ответ 2

Если вы можете захватить изображение и сохранить его на локальное хранилище, выполните следующие действия:

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

вам следует передать путь out к другому действию:

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

вместо bitIntent.putExtra("BitmapImage", mBitmap);

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

Ответ 3

Мы не можем пройти Bitmap через дополнительные задания. Причина в том, что шина Inner Process Communication (IPC) имеет ограничение 1 мб. Этот предел применяется к Bundle, который представляет Intent дополнительные функции