72 votes

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

Arrière-plan

J'ai une application avec SDK Admob utilisé pour afficher des annonces Interstitielles (publicités en plein écran).

Reccently Google a mis à jour le SDK, ainsi que beaucoup d'autres choses (outils de construction, plugin gradle, IDE, etc...), y compris admob (firebase annonces).

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

Le problème

Après la mise à jour, j'ai remarqué qu'à chaque fois que l'application tente de montrer un Interstitiel, il se bloque.

Le crash est comme suit:

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

C'est que ça marchait bien avant. Maintenant, je ne suis pas sûr de ce qu'il provoque à se produire.

La recherche sur le web, je ne vois rien qui parle de "Seulement fullscreen activités peuvent demander de l'orientation" .

Ce que j'avais dans le manifeste, est quelque chose d'un peu vieux, qui ne pourrait pas ê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 c'est probablement pas nécessaire, parce que je ne peux plus la voir dans les tutos, même si je m'en souviens je l'ai fait dans le passé:

Ce que j'ai essayé

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

  2. J'ai essayé de définir le thème "@android:style/Thème.Translucide.NoTitleBar.Fullscreen" par la force, mais il n'a pas aidé.

  3. J'ai même pensé qu'il pourrait être parce que j'ai actuellement Android 8.1, mais quand j'ai essayé d'utiliser l'application depuis le play store, j'ai remarqué qu'il a très bien fonctionné, sans se bloque.

  4. J'ai essayé de retourner jusqu'à la version 11.2.2 de admob et l'utilisation gradle v 2.3.3 , mais il n'a pas aidé.

  5. En essayant sur un émulateur Android avec la version 7.0 , il a bien fonctionné avec les dernières versions de tout, et le retrait de l'ensemble du manifeste de l'activité de la balise.

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

    compiler 'com.google.android.gms:jouer-services-petites annonces:11.4.2'

Encore s'est écrasé sur mon téléphone (Nexus 5 fois avec Android 8.1), mais de ne pas planter sur émulateur.

  1. Enfin, j'ai essayé d'exécuter l'application sur l'émulateur Android avec 8.1, et il s'est écrasé juste que sur le périphérique réel.

  2. Rapporté au sujet de ce à Google Admob de l'équipe, ainsi que Android bug tracker. J'espère qu'ils vont me répondre à ce sujet.

Les questions

Ce qui pourrait être la cause de ce problème?

C'est à cause de Android 8.1 ? Si oui, comment se fait l'ancienne version de l'application a bien fonctionné? J'ai essayé de revenir, il y a beaucoup de versions plus anciennes, mais encore, il s'est écrasé.

Et, plus important encore, comment puis-je le résoudre?

63voto

Silverstorm Points 2397

MODIFIER

Maintenant, une nouvelle version d'admob est disponible. Je confirme qu'en utilisant les dernières versions (15.0.1 ou plus récent) cette question n'apparaît pas plus, donc vous pouvez utiliser la dernière version d'Admob

com.google.firebase:firebase-ads:17.1.2

le réglage de la cible de la version la plus récente, si vous avez utilisé la solution de contournement suggéré précédemment.

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

Définir la cible de l'API Android Niveau 26 pour résoudre le problème, en attendant Admob mise à jour

Dans la construction.gradle

targetSdkVersion 26

si targetSdkVersion est >=27 ( > android.os.Build.VERSION_CODES.Osoit 26), vous obtenez cette erreur, ils ont changé ActivityRecord dans la dernière version d'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 ce commit

Pour en prévenir le non-fullscreen activités d'influencer l'orientation de Cette liste de modifications applique les activités de ciblage O et au-delà ne peut spécifier une orientation si ils sont en plein écran.

et probablement dans admob lib ont foiré quelques

45voto

Omar Mahmoud Points 602

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"
 

3voto

merci de ne pas utiliser les propriétés dans Android fichiers Manifest adactivity que.

veuillez supprimer cette ligne de adactivity que dans le fichier de Manifeste

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

Seulement il suffit d'ajouter cette ligne suivante au fichier Manifeste Android.

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

Si vous souhaitez définir votre activité désirée comme mode portrait, merci d'ajouter cette ligne suivante à votre activités méthode onCreate:

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

Pour firebase ANNONCES 17.0.0 et le haut des versions utiliser cette ligne au fichier manifeste.

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

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

</application>

Vous pouvez obtenir l'id de l'application de Admob -> Apps -> app -> Paramètres de l'Application -> Id de l'Application. S'il vous plaît copiez et collez cette App_Id dans votre projet.

2voto

Najaf Ali Points 403

Cette question sera Automatiquement fixé lors de l'annonce mob à jour leurs annonces sdk pour API 27 leurs annonces de dépendance ne prennent pas en charge l'API 27 donc à cause que cela se produise.

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

Seulement en plein écran les activités peuvent demander de l'orientation, cela est dû aux annonces des méta-données dans votre mainfest fichier,admob doivent mettre à jour leur sdk pour 27 version. enter image description here

si vous avez défini des cibles version du sdk 27 ensuite, vous recevez cette erreur, en fait la mise à jour android sdk très rapide, et une mise à jour admob laissé faire ,pour l'intégration avec android sdk, donc admob ont dans l'attente de cette mise à jour, ils doivent le faire très vite ,Son pas sur le côté développeur question, si on veut s'échapper de ce crash, puis réglez votre sdk pour 26.

1voto

Ziem Points 616

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'

        ...
    }
}

...
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X