Сбой запуска приложения Android - customtabs.CustomTabsSession.validateRelationship

Я следовал рекомендациям Googles для недавних Trusted Web Activity, и мое приложение работало нормально на моем устройстве и некоторых избранных эмуляторах.

Тем не менее, на некоторых устройствах и эмуляторах (таких как Google Pixel 2) я получаю немедленный сбой при запуске.

Logcat выводит:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ocdev.yu_gi_ohdatabase, PID: 5020
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.customtabs.CustomTabsSession.validateRelationship(int, android.net.Uri, android.os.Bundle)' on a null object reference
        at android.support.customtabs.TrustedWebUtils.launchAsTrustedWebActivity(TrustedWebUtils.java:134)
        at android.support.customtabs.trusted.LauncherActivity$TwaCustomTabsServiceConnection.onCustomTabsServiceConnected(LauncherActivity.java:199)
        at android.support.customtabs.CustomTabsServiceConnection.onServiceConnected(CustomTabsServiceConnection.java:44)
        at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1634)
        at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1663)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ocdev.yu_gi_ohdatabase">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ygo_fore"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ygo_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="asset_statements"
            android:resource="@string/asset_statements" />
        <activity
            android:name="android.support.customtabs.trusted.LauncherActivity">

            <!-- Edit android:value to change the url opened by the TWA -->
            <meta-data
                android:name="android.support.customtabs.trusted.DEFAULT_URL"
                android:value="https://db.ygoprodeck.com" />

            <!-- This intent-filter adds the TWA to the Android Launcher -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!--
              This intent-filter allows the TWA to handle Intents to open
              airhorner.com.
            -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE"/>

                <!-- Edit android:host to handle links to the target URL-->
                <data
                    android:scheme="https"
                    android:host="db.ygoprodeck.com"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

Модуль build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.ocdev.yu_gi_ohdatabase"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.github.GoogleChrome.custom-tabs-client:customtabs:3a71a75c9f'
    implementation 'com.android.support:support-media-compat:28.0.0'
    implementation 'com.android.support:animated-vector-drawable:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
}

Проект build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Я также протестировал мой релиз apk на эмуляторах Android через Browserstack, и я получил точно такую ​​же проблему. Я также получил проблему на некоторых физических устройствах, которые я тестирую, таких как Samsung Galaxy S7 Edge, но странно то, что я тестировал другую Galaxy S7 Edge, и она работала без проблем. Из того, что я тестировал до сих пор, я предполагаю, что это работает на 50% устройств, которые я тестировал. Я не являюсь наследником разработчика Android, поэтому я изо всех сил пытаюсь найти причину этой проблемы и понять, почему она работает нормально и на некоторых устройствах, а не на других.

3 ответа

Решение

Я разместил этот вопрос на форумах Chromium и был перенаправлен на временное исправление, указанное здесь.

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

Ответ дан:

На данный момент вы можете изменить последний параметр на CustomTabsClient # getPackageName здесь на true. Этот параметр - ignoreDefault, и, как вы можете догадаться, при выборе пакета будет игнорироваться пользовательское значение по умолчанию. В идеале, хотя это не понадобится надолго.

У меня та же проблема.

Я заметил, что если я обновляю Chrome до последней версии (в настоящее время 72), TWA работает отлично. Что раздражает, так это отсутствие сообщения об ошибке для пользователя, чтобы заставить его обновить Chrome.

ИМО это делает TWA в настоящее время непригодным для использования.

У меня тоже есть эта проблема с моим TWA, я обнаружил, что если браузер по умолчанию установлен на chrome или edge, он будет работать, но не для браузера Samsung и Firefox

Эта проблема может больше не возникать с новыми версиями. Однако, если кто-то все еще использует старые версии, может помочь обновление до новой версии. В новой версии функция проверки была удалена как объяснение:

Разрешить отправку нескольких доверенных источников от клиентов TWA В настоящее время, если пользователь может перемещаться или перенаправляется на другой доверенный источник в TWA, единственный способ гарантировать, что другой источник будет проверен, - это вызвать CustomTabsSession#verifyRelationship на стороне клиента.. Помимо того, что это немного неудобный API, это приведет к задержке запуска Chrome и, следовательно, отображения экрана-заставки, поэтому это необходимо изменить.

Пожалуйста, проверьте этот ответ. /questions/16604799/nullpointerexception-pri-ispolzovanii-doverennyih-veb-operatsij-na-android-neskolko-ustrojstv/55129295#55129295

Другие вопросы по тегам