私は、インタースティシャル広告(フルスクリーン広告)を表示するために、Admob SDKを使用したアプリを使用しています。
最近Googleは、admob(firebase ads)を含む他の多くのもの(ビルドツール、グラドルプラグイン、IDEなど)と共にSDKを更新しました。
compile 'com.google.firebase:firebase-ads:11.4.2'
更新後、アプリがインタースティシャル広告を表示しようとするたびにクラッシュすることに気付きました。
クラッシュログは以下のとおりです。
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
事は前にうまく働いたということです。今何が起こるのかわからない。
ウェブを検索しても、「全画面表示のアクティビティのみがオリエンテーションを要求できる」ということについて話しているものは何も見当たりませんでした。
私がマニフェストで持っていたものはもう少し古いもので、もう必要ないかもしれません:
<activity
Android:name="com.google.Android.gms.ads.AdActivity"
Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
Android:theme="@Android:style/Theme.Translucent"/>
私は過去にやったことを覚えていますが、私はそれがチュートリアルでもう見ることができないので、おそらくそれは必要ではないと言います:
マニフェストエントリを削除しようとしました。まだ同じ問題です。
テーマを強制的に "@Android:style/Theme.Translucent.NoTitleBar.Fullscreen"に設定しようとしましたが、それも助けにはなりませんでした。
私はそれが私が現在アンドロイド8.1を持っているからかもしれないと思いさえしました、しかし私がPlayストアからアプリを使用しようとしたとき、私はそれがクラッシュすることなく、うまく働いたことに気づきました。
私はadmobのバージョン11.2.2まで戻ってgradle v 2.3.3を使おうとしましたが、それも助けにはなりませんでした。
Android 7.0でエミュレータを試そうとしたとき、それはすべての最新版と、マニフェストアクティビティタグ全体の削除でうまくいきました。
私が使ったものではなく、これをgradleファイルで使用しようとしました。
「com.google.Android.gms:play-services-ads:11.4.2」をコンパイルします。
私のデバイス(Android 8.1のNexus 5x)でまだクラッシュしましたが、エミュレータではクラッシュしませんでした。
最後に、私はAndroid 8.1搭載のエミュレータでアプリを実行しようとしましたが、実際のデバイスと同じようにクラッシュしました。
これについてGoogle Admobチームに報告しました。同様に Android issue tracker 。私は彼らがこれについて私に答えてくれることを願っています。
この問題の原因は何ですか?
Android 8.1が原因ですか?もしそうなら、どのようにしてアプリの古いバージョンがうまくいったのでしょうか?多くのバージョンを古いものに戻すことを試みましたが、それでもまだクラッシュしました。
そして、最も重要なのは、どうすればそれを解決できるかということです。
次のようにアップグレードするようです。
com.google.firebase:firebase-ads:15.0.1
私のためにこの問題を解決しました。私はちょうど8.1.0とNexus 5X上でそれをテストし、インタースティシャルAdmob広告は現在動作します。
より完全な解決策:
アプリのbuild.gradle:
...
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'
トップレベルのbuild.gradle:
buildscript {
...
dependencies {
...
classpath 'com.google.gms:google-services:3.3.0'
...
}
}
...
EDIT
現在、新しいバージョンのadmobが利用可能です。最新のリリース(15.0.1以降)を使用しても問題が発生しなくなったことを確認したので、最新バージョンのAdmobを使用できます。
com.google.firebase:firebase-ads:17.1.2
以前に提案した回避策を使用した場合は、ターゲットバージョンを最新に設定します。
----------------------------------------- -----------------
Admobのアップデートを待って、Android APIレベルを26に設定して問題を解決してください。
Build.gradle内
targetSdkVersion 26
targetSdkVersion
が27以上(> Android.os.Build.VERSION_CODES.O
t26)であれば、このエラーが表示されます。最新のAndroidバージョンでは ActivityRecord が変更されています。
void setRequestedOrientation(int requestedOrientation) {
if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen
&& appInfo.targetSdkVersion > O) {
throw new IllegalStateException("Only fullscreen activities can request orientation");
....
}
この変更は このコミットで紹介されました
フルスクリーンではないアクティビティがオリエンテーションに影響を与えないようにするこのチェンジリストは、O以上をターゲットとするアクティビティがフルスクリーンである場合にのみオリエンテーションを指定できることを強制します。
そしておそらくadmobのlibでいくつかのチェックを台無しにしました
これをあなたのマニフェストに追加してみてください
<activity
Android:name="com.google.Android.gms.ads.AdActivity"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="Android:theme"
/>
または、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
そしてマニフェストでは、アクティビティがで宣言されていることを確認してください
Android:theme="@style/TranslucentTheme"
androidマニフェストファイルAdActivityのプロパティを使用しないでください。
マニフェストファイルのAdActivityからこの行を削除してください。
Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
以下の行をAndroid Manifestファイルに追加するだけです。
<activity Android:name="com.google.Android.gms.ads.AdActivity" />
目的のアクティビティをポートレートモードに設定する場合は、アクティビティのonCreateメソッドに次の行を追加してください。
if (Android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Firebase ADS 17.0.0以降の場合は、この行を使用してファイルをマニフェストします。
<application
...........>
<meta-data
Android:name="com.google.Android.gms.ads.APPLICATION_ID"
Android:value="@string/app_id" />
</application>
あなたはAdmob - >アプリ - >あなたのアプリ - >アプリ設定 - >アプリIDからアプリIDを取得できます。このApp_Idをコピーしてプロジェクトに貼り付けてください。
この問題は、ad mobがAPI 27用にads sdkを更新するときに自動的に修正されます。広告依存関係がAPI 27をサポートしていないため、この問題が発生します。
compile 'com.google.Android.gms:play-services-ads:11.8.0'
フルスクリーンアクティビティのみがオリエンテーションを要求することができます、これはあなたのmainfestファイルのadsメタデータによるもので、admobは27バージョン用に彼らのsdkを更新するべきです。
あなたがターゲットSDKバージョン27を設定しているなら、あなたはこのエラーを得るでしょう、実際にAndroidはSDKを非常に速くアップデートし、Android SDKとの統合のため、それは開発者側の問題ではありません、あなたがこのクラッシュから脱出したい場合は26にあなたのSDKを設定してください。
私は(Appodeal SDKを通じて含まれていた)Vungle SDKで同じクラッシュを受けました、それでこれはAdmob SDKに関する質問に正確に答えません、しかしだれでもVungleまたはAppodeal SDKでこれを手に入れたなら:
バージョンは、Appodeal SDK - 2.4.2-220518
、Vungle SDK - 6.2.5
です。当時最新のAppodeal SDK(バージョン2.4.9-051218
)にアップグレードした後、新しいVungle SDKが含まれ(バージョン6.3.12
)、クラッシュは発生しなくなりました。