Wyjątek Android TransactionTooLargeException po wywołaniu takePicture

0

Pytanie

Muszę korzystać z aparatu w mojej aplikacji do pracy, widzę, że w API >= 28 wszystko się zmieniło w porównaniu z tym, jak robiłem to wcześniej, kiedy mogłem użyć startActivityForResult.

Jednak spotykam się z problemem, kiedy uruchamiam aplikację aparatu i od razu pojawia się komunikat o błędzie "TransactionTooLargeException" w konsoli debugowania/uruchomienia.

Do połączenia kamery robię

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

                }
            }
    );

Gdzie mGetContent zdefiniowana w klasie jak

private ActivityResultLauncher<Uri> mGetContent;

W moim AndroidManifest.xml plik mam następny

<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>

W moim pliku file_paths mam

<?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>

W mojej działalności jest skonfigurowany przycisk, za pomocą którego uruchamiam kamerę za pomocą

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

Jak tylko klikam na przycisk i otwiera się aplikacja "Aparat", dostaję to, że mogę tylko przypuszczać, - zbyt ogólny komunikat o błędzie.

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)

Próbowałem szukać w Google, aby znaleźć coś, ale mam problemy z określeniem, na czym polega prawdziwy problem.

Niektóre propozycje podałeś mi na stan onSaveInstanceState, więc переопределил go i ustawia punkt przerwania, aby zobaczyć, co się dzieje, ale to poszło bez żadnych problemów (z tego co mogę powiedzieć).

Mętlik w głowie z tym.

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

Najlepsza odpowiedź

0

Pytania dotyczące tego, co stanowi pakiet w stanie onSaveInstanceState.

Mam kilka odsłon zdjęć, przyciski zdjęć i po prostu wspólne przyciski w moim aplikacji, aby ułatwić pracę naszym pracownikom.

Przeszedłem i zmienił "Stan zachowania" wszystkich odsłon obrazków i przycisków zdjęć z domyślnej wartości true na false, tak jak nie obchodzi mnie, w jakim stanie byli, to po prostu wizualnych instrukcji.

Wziął android:viewHierarchyState z 1,2 MB do 1,6 KB, rozmiar mojej paczki teraz wynosi 3,3 KB, i już nie wywala przy wstrzymaniu aplikacji, aby uruchomić aplikację aparatu.

TooLargeTool był użyteczny, ale nie mogłem zmusić go do pracy tak, jak jest napisane na stronie Github, powiedziałem mu "Rozpocznij nagrywanie", i w mojej działalności, gdzie wystąpił błąd, zainstalowałem punkt przerwania i sprawdził, rejestrował czy z pomocą "isLogging", a on wrócił "prawdziwym".

W końcu, po prostu запротоколировал wniosek TooLargeTool.bundleBreakdown(outState) w stanie onSaveInstanceState.

Dzięki Гейбу Сечану i Янханнибаллейку za to, że wskazał mi, co to może być, dla tego konkretnego wyjątku nie jest tak dużo, to znaczy, że ono istnieje, ale chyba dla wszystkich jest różny.

Naprawdę chciałbym, aby Google wydrukowałem najlepszy zestaw komunikatów o błędach, aby łatwiej było określić, jakie działanie było problemem (lub, w moim przypadku, wszystkie 3 kroki razem wzięte).

2021-11-25 05:48:50

W innych językach

Ta strona jest w innych językach

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