web-dev-qa-db-fra.com

Annonces Admob interstitielles: "IllegalStateException: seules les activités plein écran peuvent demander une orientation"

Contexte

J'ai une application avec Admob SDK utilisée pour afficher des annonces interstitielles (annonces plein écran).

Récemment, Google a mis à jour le SDK, ainsi que de nombreux autres éléments (outils de construction, plug-in Gradle, IDE, etc.), notamment admob (annonces firebase).

compile 'com.google.firebase:firebase-ads:11.4.2'

Le problème

Après la mise à jour, j'ai remarqué que l'application s'effondrait chaque fois que l'application essayait d'afficher une annonce interstitielle.

Le journal des incidents est en tant que tel:

10-28 14:01:01.394 4523-4523/... I/Ads: Ad opening.
10-28 14:01:01.400 1606-2154/? E/ActivityManager: Activity Manager Crash. UID:10080 PID:4523 TRANS:63
                                                  Java.lang.IllegalStateException: Only fullscreen activities can request orientation
                                                      at com.Android.server.am.ActivityRecord.setRequestedOrientation(ActivityRecord.Java:2189)
                                                      at com.Android.server.am.ActivityManagerService.setRequestedOrientation(ActivityManagerService.Java:4975)
                                                      at Android.app.IActivityManager$Stub.onTransact(IActivityManager.Java:1101)
                                                      at com.Android.server.am.ActivityManagerService.onTransact(ActivityManagerService.Java:2927)
                                                      at Android.os.Binder.execTransact(Binder.Java:697)


10-28 14:01:01.403 4523-4523/... D/AndroidRuntime: Shutting down VM
10-28 14:01:01.406 4523-4523/... E/AndroidRuntime: FATAL EXCEPTION: main

Java.lang.RuntimeException: Unable to start activity ComponentInfo{.../com.google.Android.gms.ads.AdActivity}: Java.lang.IllegalStateException: Only fullscreen activities can request orientation

La chose est que cela a bien fonctionné avant. Maintenant, je ne suis pas sûr de ce qui le cause.

En recherchant sur le Web, je n'ai rien vu qui parle de "Seules les activités plein écran peuvent demander une orientation". 

Ce que j'avais dans le manifeste, c'est quelque chose d'un peu vieux, qui n'est peut-être plus nécessaire:

    <activity
        Android:name="com.google.Android.gms.ads.AdActivity"
        Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        Android:theme="@Android:style/Theme.Translucent"/>

Je dis que ce n'est probablement pas nécessaire, parce que je ne le vois plus dans les tutoriels, même si je me souviens de l'avoir déjà fait:

Ce que j'ai essayé

  1. J'ai essayé de supprimer l'entrée du manifeste. Toujours le même problème.

  2. J'ai essayé de définir le thème comme suit: "@Android: style/Theme.Translucent.NoTitleBar.Fullscreen", mais cela n'a pas aidé.

  3. J'ai même pensé que c'était peut-être parce que je possédais actuellement Android 8.1, mais lorsque j'ai essayé d'utiliser l'application du Play Store, j'ai remarqué que cela fonctionnait parfaitement, sans crash.

  4. J'ai essayé de revenir à la version 11.2.2 d'admob et d'utiliser Gradle v 2.3.3, mais cela ne m'a pas aidé.

  5. Lorsque vous essayez un émulateur avec Android 7.0, cela fonctionne correctement avec les dernières versions de tout et avec la suppression de la balise d'activité du manifeste.

  6. J'ai essayé d'utiliser ce fichier dans Gradle, au lieu de ce que j'ai utilisé:

    compiler 'com.google.Android.gms: play-services-ads: 11.4.2' 

Toujours en panne sur mon appareil (Nexus 5x avec Android 8.1) mais pas en panne sur l'émulateur.

  1. Enfin, j'ai essayé d'exécuter l'application sur l'émulateur avec Android 8.1, et celle-ci s'est écrasée comme sur le périphérique réel. 

  2. Nous en avons parlé à l'équipe Google Admob, ainsi qu'à Android Track Tracker . J'espère qu'ils vont me répondre à ce sujet.

Questions

Quelle pourrait être la cause de ce problème?

Est-ce à cause d'Android 8.1? Si oui, comment se fait-il que l'ancienne version de l'application fonctionne correctement? J'ai essayé de revenir là-bas beaucoup de versions à d'anciennes, mais il s'est quand même écrasé.

Et surtout, comment puis-je le résoudre?

67
android developer

Il semble que passer à:

com.google.firebase:firebase-ads:15.0.1

résolu ce problème pour moi. Je viens de le tester sur Nexus 5X avec 8.1.0 et les annonces Admob interstitielles fonctionnent maintenant.

Solution plus complète:

build.gradle de l'application:

...

Android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'

    defaultConfig {
        ...

        targetSdkVersion 27

        ..
    }
}

dependencies {
    ...

    implementation 'com.google.firebase:firebase-core:15.0.2'
    implementation 'com.google.firebase:firebase-ads:15.0.1'

    ...
}
apply plugin: 'com.google.gms.google-services'

niveau supérieur build.gradle:

buildscript {
    ...

    dependencies {
        ...

        classpath 'com.google.gms:google-services:3.3.0'

        ...
    }
}

...
1
Ziem

MODIFIER

Une nouvelle version d'admob est désormais disponible .. Je confirme que le problème n'apparaît plus à l'aide des dernières versions (15.0.1 ou plus récente), vous pouvez donc utiliser la dernière version d'Admob.

com.google.firebase:firebase-ads:17.1.2

définissez la version cible sur la dernière, si vous avez utilisé la solution de contournement précédemment suggérée.

---------------------------------------------------- ----------

Définissez la cible sur Android API Level sur 26 pour résoudre le problème, dans l’attente de la mise à jour Admob.

Dans build.gradle

targetSdkVersion 26

si targetSdkVersion est> = 27 (> Android.os.Build.VERSION_CODES.Othat est 26) vous obtenez cette erreur, ils ont changé ActivityRecord dans la dernière version Android, en ajoutant ceci:

void setRequestedOrientation(int requestedOrientation) {
        if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen
                && appInfo.targetSdkVersion > O) {
            throw new IllegalStateException("Only fullscreen activities can request orientation");
        ....
        }

Le changement a été introduit dans this commit

Empêcher les activités non plein écran d’influencer l’orientation Ceci changelist impose que les activités ciblant O et au-delà ne peuvent que spécifiez une orientation s'ils sont en plein écran.

et probablement dans admob lib ont décoché un chèque

61
Silverstorm

essayez d'ajouter ceci dans votre manifeste 

<activity
Android:name="com.google.Android.gms.ads.AdActivity"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="Android:theme"
 />

Ou, si vous utilisez appcompat:

<style name="TranslucentTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:windowActionBar">false</item>
    <item name="Android:windowFullscreen">true</item>
    <item name="Android:windowContentOverlay">@null</item>
    etc

Et dans le manifeste, assurez-vous que l'activité est déclarée avec

Android:theme="@style/TranslucentTheme"
41
Omar Mahmoud

s'il vous plaît, n'utilisez aucune propriété dans les fichiers Manifest Android AdActivity.

veuillez supprimer cette ligne du fichier AdActivity dans le fichier manifeste

Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Ajoutez simplement cette ligne suivante au fichier Android Manifest.

    <activity Android:name="com.google.Android.gms.ads.AdActivity" />

Si vous souhaitez définir l'activité souhaitée en mode portrait, ajoutez cette ligne à la méthode onCreate de vos activités:

if (Android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
   activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Pour Firebase ADS 17.0.0 et les versions supérieures, utilisez cette ligne pour manifester le fichier. 

<application
...........>

    <meta-data
        Android:name="com.google.Android.gms.ads.APPLICATION_ID"
        Android:value="@string/app_id" />

</application>

Vous pouvez obtenir un identifiant d'application depuis Admob -> Applications -> votre application -> Paramètres de l'application -> Identifiant de l'application. Veuillez copier et coller cette App_Id dans votre projet.

2

Ce problème sera automatiquement résolu lorsque ad mob mettra à jour leurs sdk d’annonces pour l’API 27 Leur dépendance aux annonces ne prend pas en charge l’API 27, du fait de ce problème.

 compile 'com.google.Android.gms:play-services-ads:11.8.0'

Seules les activités en plein écran peuvent demander une orientation, cela est dû aux métadonnées des annonces dans votre fichier mainfest, admob doit mettre à jour son sdk pour la version 27 .  enter image description here

si vous avez défini la version 27 de sdk cible, vous obtiendrez cette erreur. En fait, Android met à jour très rapidement les sdk, et certaines mises à jour laissées à faire, pour l'intégration avec Android sdk. Ce n'est pas un problème côté développeur, si vous voulez échapper à cet incident, définissez votre sdk sur 26.

1
Najaf Ali

J'ai eu le même crash avec Vungle SDK (qui était inclus dans Appodeal SDK), donc cela ne répond pas précisément à la question relative à Admob SDK, mais au cas où quelqu'un l'aurait avec Vungle ou Appodeal SDK:

Les versions étaient les suivantes: Appodeal SDK - 2.4.2-220518, Vungle SDK - 6.2.5. Après la mise à niveau vers le SDK Appodeal le plus récent (version 2.4.9-051218), le nouveau SDK Vungle était inclus (version 6.3.12) et le blocage ne se produisait plus.

0
Adomas