Android TransactionTooLargeException při volání TakePicture

0

Otázka

Je třeba využívat fotoaparát v mém aplikace pro práci, vidím, že se věci změnily v API >= 28 ve srovnání s tím, jak jsem to dělal tam, kde jsem mohl pomocí startActivityForResult.

Nicméně jsem čelí problému, kde jsem spuštění fotoaparátu app, a okamžitě získat 'TransactionTooLargeException' chybová zpráva v debug/run console.

Pro vyvolání fotoaparátu, dělám

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

                }
            }
    );

Kde mGetContent je definována ve třídě jako

private ActivityResultLauncher<Uri> mGetContent;

V mém AndroidManifest.xml soubor mám následující

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

V mém file_paths souboru mám

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

Mám tlačítko nastavit v mé činnosti, kde jsem spuštění fotoaparátu 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);
};

Jakmile jsem klepněte na tlačítko, a aplikace fotoaparátu se otevře, jsem se dostat to, co mohu jen předpokládat, že je příliš obecná chybová zpráva.

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)

Snažila vyhledávání Google najít věci, ale nepodařilo zastihnout, co skutečný problém je.

Některé návrhy mě nasměruje onSaveInstanceState, tak jsem se to změnit a nastavit zarážku na to, aby viděli, co se děje, ale to zvládla bez problémů (z toho, co jsem mohl říct).

Trochu na rozpacích s tímto jeden.

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

Nejlepší odpověď

0

Wowsers jak na to, co tvoří svazek v onSaveInstanceState.

Mám nějaké imageviews, imagebuttons, a jen obecně tlačítek v mé aplikaci, aby se věci jednodušší pro naše zaměstnance.

Prošla jsem a změnil 'přední' ze všech ImageViews a ImageButtons z výchozí true na false, protože nezajímá mě, co říkají, že oni byli, oni jsou jen vizuální vodítka.

Vzal android:viewHierarchyState od 1.2 MB dolů na 1,6 KB, můj Balík velikost je nyní 3.3 KB a to už zhroutí při pozastavení aplikace k vyvolání aplikace fotoaparátu.

TooLargeTool bylo užitečné, ale nemohl jsem, aby to fungovalo tak, jak Github stránky říká, že jsem to řekl, aby 'startLogging', a v mé činnosti, kde havárie se děje, nastavit zarážky a zkontrolovat, zda bylo přihlášení pomocí 'isLogging a vrátil se "pravda".

Nakonec jsem to měl log výstup TooLargeTool.bundleBreakdown(outState) v onSaveInstanceState.

Díky Gabe Sechan a ianhanniballake pro mě dovede k tomu, co by to mohlo být, tam není moc tam, na této konkrétní výjimky, myslím, že tam je, ale zdá se, že to je různé pro každého.

Opravdu si Google by vytisknout lepší chybové zprávy pro to aby to bylo snazší zjistit, která činnost byla problém (nebo v mém případě, všechny 3 aktivity v kombinaci).

2021-11-25 05:48:50

V jiných jazycích

Tato stránka je v jiných jazycích

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