Исключение Android TransactionTooLargeException при вызове takePicture

0

Вопрос

Мне нужно использовать камеру в моем приложении для работы, я вижу, что в API >= 28 все изменилось по сравнению с тем, как я делал это раньше, когда я мог использовать startActivityForResult.

Однако я сталкиваюсь с проблемой, когда запускаю приложение камеры и сразу же получаю сообщение об ошибке "TransactionTooLargeException" в консоли отладки/запуска.

Для вызова камеры я делаю

mGetContent = registerForActivityResult(
            new ActivityResultContracts.TakePicture(),
            result -> {
                if (result) {

                }
            }
    );

Где mGetContent определяется в классе как

private ActivityResultLauncher<Uri> mGetContent;

В моем AndroidManifest.xml файл У меня есть следующий

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.test.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

В моем файле file_paths у меня есть

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path
        name="files"
        path="."/>
    <files-path
        name="app_images"
        path="./files/"/>
</paths>

В моей деятельности настроена кнопка, с помощью которой я запускаю камеру с помощью

findViewById(R.id.button)).setOnClickListener(v -> {
    File directory = new File(context.getFilesDir(), "app_images");
    if (!directory.exists()) directory.mkdir();

    File file = new File(directory, "image.jpg");

    Uri uri = getUriForFile(this, "com.test.fileprovider", file);

    mGetContent.launch(uri);
};

Как только я нажимаю на кнопку и открывается приложение "Камера", я получаю то, что могу только предположить, - слишком общее сообщение об ошибке.

E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 1284092)
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test, PID: 14296
    java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1284092 bytes
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:161)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7397)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
     Caused by: android.os.TransactionTooLargeException: data parcel size 1284092 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(BinderProxy.java:511)
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4524)
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)

Пытался искать в Google, чтобы найти что-то, но у меня возникли проблемы с определением того, в чем заключается реальная проблема.

Некоторые предложения указали мне на состояние onSaveInstanceState, поэтому я переопределил его и установил точку останова, чтобы посмотреть, что происходит, но это прошло без каких-либо проблем (из того, что я мог сказать).

Немного растерян с этим.

android android-camera java
2021-11-24 06:48:37
1

Лучший ответ

0

Вопросы относительно того, что составляет пакет в состоянии onSaveInstanceState.

У меня есть несколько просмотров изображений, кнопки изображений и просто общие кнопки в моем приложении, чтобы облегчить работу нашим сотрудникам.

Я прошел и изменил "Состояние сохранения" всех просмотров изображений и кнопок изображений с значения по умолчанию true на значение false, так как мне все равно, в каком состоянии они находились, это просто визуальные руководства.

Взял android:viewHierarchyState с 1,2 МБ до 1,6 КБ, размер моей посылки теперь составляет 3,3 КБ, и он больше не вылетает при приостановке приложения для запуска приложения камеры.

TooLargeTool был полезен, но я не мог заставить его работать так, как написано на странице Github, я сказал ему "Начать запись", и в моей деятельности, где произошел сбой, я установил точку останова и проверил, регистрировался ли он с помощью "isLogging", и он вернулся "истинным".

В конце концов, я просто запротоколировал вывод TooLargeTool.bundleBreakdown(outState) в состоянии onSaveInstanceState.

Спасибо Гейбу Сечану и Янханнибаллейку за то, что указали мне, что это может быть, для этого конкретного исключения не так уж много, я имею в виду, что оно есть, но, похоже, для всех оно разное.

Действительно хотелось бы, чтобы Google распечатал лучший набор сообщений об ошибках, чтобы было проще определить, какое действие было проблемой (или, в моем случае, все 3 действия вместе взятые).

2021-11-25 05:48:50

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................