Кажется, намерение не отправляется между действиями

Я написал приложение с двумя действиями. Одно действие сделало снимок, а второе использовало его с некоторыми фильтрами.

Действие 1:

Intent FilterSelectionIntent = new Intent(getActivity(), PulsFiltersActivity.class);
FilterSelectionIntent.putExtra("PicTaken", currentBitmap);
startActivity(FilterSelectionIntent);

Действие 2:

    Bundle bd = intent.getExtras();
    mBitmap = bd.getParcelable("PicTaken");

Я поставил несколько точек останова в Activity 2, и они никогда не останавливаются на достигнутом. Как только я прокомментирую «putExtra» в комментарии, я смогу достичь точек останова. В моем случае активность не запущена, я думаю, что намерение неверно.

Я знаю, что одним из решений является использование Bitmap.compress и пересылка результата в поток вывода. но в моем случае это занимает слишком много времени. Мое устройство Android очень простое, и для сохранения bmp требуется 2 секунды. вот почему я пытаюсь использовать намерение передать аргумент, но, похоже, это не работает.

Я также открыт для сохранения bmp в виде файла tmp, но я могу потерять 2 секунды.

Есть идеи .


person Seb    schedule 28.07.2015    source источник


Ответы (4)


Bitmap реализует Parcelable, поэтому вы всегда можете передать его в намерении:

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("BitmapImg", bitmap);

и получить его на другом конце:

Intent intent = getIntent();
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImg");

Проверьте это здесь: Как я могу передать объект Bitmap из одного действия в другое

person SANAT    schedule 28.07.2015

Я думаю, вы перепутали пару понятий отправки объектов. В своем Activity 1 вы добавляете лишнее непосредственно к намерению. В Activity 2 вы пытаетесь получить его обратно от Bundle, которому вы не поставили Bitmap. Итак, попробуйте это в своей деятельности 2:

mBitmap = (Bitmap) intent.getParcelableExtra("PicTaken");

Изменить: я обнаружил некоторые сообщения о том, что растровые изображения слишком велики для отправки, а действия не запускаются при отправке растровых изображений. Может помочь преобразование их в ByteArray.

person milez    schedule 28.07.2015

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

    final static String IMG_PATH= "bmp2Store"
    FileOutputStream streamOut;
    Bitmap image = currentBitmap;
    try {
            // Store bitmap into internal storage
            streamOut = mContext.openFileOutput(IMG_PATH, Context.MODE_PRIVATE);
            image.compress(Bitmap.CompressFormat.PNG, 100, streamOut);
            streamOut.close();

            // Call ActivityB
            Intent intent= new Intent(this, ConsumirOfertaActivity.class);
            startActivity(intent);
     } catch (FileNotFoundException e) {
            e.printStackTrace();
     } catch (IOException e){
            e.printStackTrace();
     }

И в деятельности B:

    final static String IMG_PATH= "bmp2Store"
    Bitmap bitmap;
    FileInputStream streamIn;

    try {
        streamIn = openFileInput(IMG_PATH);
        bitmap = BitmapFactory.decodeStream(streamIn);
        streamIn.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
person Anexon    schedule 28.07.2015

Вы не должны передавать растровое изображение внутри пакета:

Размер данных, которые вы можете передавать через Bundle или Intent, очень мал (~1 МБ). Учитывая такой объект, как Bitmap, высока вероятность того, что ему выделена память более 1 МБ. Это может произойти для любого типа объекта, включая массив байтов, строку и т. д.

Решение. Сохраните растровое изображение в классе File, FileProvider, Singleton (конечно, как WeakReference) и т. д. перед началом действия B и передайте только URI в качестве параметра в Bundle.

Также ознакомьтесь с этими сообщениями: Ограничение размера Intent.putExtras? и Максимальная длина метода Intent putExtra? (Принудительно закрыть)

person AndroidCoolestRulest    schedule 29.07.2015