AdMobについてはいろいろトラブル多いですよねぇ・・・。
OSの仕様がコロコロ変わってレイアウト指定が無反応になったり。
とりあえず当方では Android 9 まで大丈夫そうなのですが、10はまだ未確認。
現在使用しているコードを晒します。
バナーは下固定で、実行時の画面縦サイズの10分の1の高さになります。
HSPコード側からも同様に下10分の1を空けることでレイアウトがほぼ一致します。
ただしDishのスケーリングを使用している場合はうまく計算が合いませんので
自前で画面サイズを調整する必要はあると思われます。
(私はいくつかの理由から自前スケーリングにしています)
なお、あえて少し古いバージョンで開発しています。
これでも一応最新OSに対応はできてます・・・。
android-sdk-windows API-21
jdk1.6.0_23 (これは署名の都合、Dish helper 改造しています)
android-ndk-r10e
apache-ant-1.9.14
以下は私の「いろぷち」で使っているものです。
https://play.google.com/store/apps/details?id=com.miecat.iroputi.free
HspActivity.java のAdMob部分。オリジナルソースと比較してみてください。
// for AdMob
static AdView _adView;
static final String APP_ID = "";
static final String BANNER_AD_UNIT_ID = "";
static InterstitialAd _interstitialAd;
static final String INTERSTITIAL_AD_UNIT_ID = "";
//static final String TestDeviceID = "*******";
static HspActivity _instance;
private static PopupWindow popUp;
private static LinearLayout layout;
private static LinearLayout mainLayout;
private static boolean adsinited = false;
private static boolean bShow = false;
private static int disp_width = 0;
private static int disp_height = 0;
private static int ad_height = 0; //独自
public static HspActivity getInstance(){
return _instance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_instance = this;
WindowManager windowmanager = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = windowmanager.getDefaultDisplay();
disp_width = disp.getWidth();
disp_height = disp.getHeight();
ad_height = disp_height/10; //独自
Log.i("HspActivity","size"+disp_width+"x"+disp_height);
MobileAds.initialize(getApplicationContext(),APP_ID);
_adView = new AdView(this);
_adView.setAdSize(AdSize.SMART_BANNER);
_adView.setAdUnitId(BANNER_AD_UNIT_ID);
_adView.setBackgroundColor(Color.TRANSPARENT);
_adView.setVisibility(View.VISIBLE);
_adView.loadAd(
new AdRequest.Builder()
//.addTestDevice(TestDeviceID)
.build()
);
layout = new LinearLayout(_instance);
mainLayout = new LinearLayout(_instance);
// The layout system for the PopupWindow will kill some pixels due to margins/paddings etc(No way to remove it), so padd it to adjust
layout.setPadding(-5, -5, -5, -5);
layout.setOrientation(LinearLayout.VERTICAL);
//interstitial
_interstitialAd = new InterstitialAd(this);
_interstitialAd.setAdUnitId(INTERSTITIAL_AD_UNIT_ID);
_interstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
}
});
requestNewInterstitial();
}
private void requestNewInterstitial() {
AdRequest adRequest = new AdRequest.Builder()
//.addTestDevice(AdRequest.DEVICE_ID_EMULATOR) // All emulators
//.addTestDevice(TestDeviceID)
.build();
_interstitialAd.loadAd(adRequest);
}
public void showIntersAd() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (_interstitialAd.isLoaded()) {
_interstitialAd.show();
}
}
});
}
public int hideAd() {
if(adsinited) {
runOnUiThread(new Runnable() {
@Override
public void run() {
_adView.removeView(layout);
_adView.setVisibility(View.GONE);
//_adView.setVisibility(View.GONE);
//_adView.pause();
bShow = false;
}
});
return 0;
}
return -1;
}
public int showAd() {
if(adsinited) {
if ( bShow == false ) {
//layout.setEnabled(true);
//layout.setVisibility(View.VISIBLE);
//_adView.resume();
//bShow = true;
}
return -1;
}
if(_adView!=null) {
Log.i("HspActivity","callAdMob.");
_instance.runOnUiThread(new Runnable() {
@Override
public void run() {
adsinited = true;
// Out popup window
popUp = new PopupWindow(_instance);
popUp.setBackgroundDrawable(null); // 背景透明(独自追加)
// This is the minimum size for AdMob, we need to set this in case our target device run at 320x480 resolution (Otherwise no ad will be shown, see the padding kill below)
popUp.setWidth(disp_width+10);
popUp.setHeight(ad_height);
popUp.setClippingEnabled(false);
MarginLayoutParams params = new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(0, 0, 0, 0);
layout.addView(_adView, params);
popUp.setContentView(layout);
_instance.setContentView(mainLayout, params);
Log.i("HspActivity","loadAd.");
popUp.showAtLocation(mainLayout, Gravity.NO_GRAVITY, -5, disp_height-ad_height+4);
popUp.update();
bShow = true;
}
});
} else {
Log.i("HspActivity","callAdMob failed.");
}
return 0;
}
@Override
protected void onResume() {
super.onResume();
if (_adView != null) {
_adView.resume();
}
}
@Override
protected void onPause() {
if (_adView != null) {
_adView.pause();
}
super.onPause();
}
@Override
protected void onDestroy() {
if (_adView != null) {
if(adsinited) {
popUp.dismiss();
}
_adView.destroy();
}
super.onDestroy();
}
public int callAdMob( int val ) {
if(_adView!=null) {
Log.i("HspActivity","callAdMob.");
if ( val < 0 ) {
hideAd();
return 0;
}
if ( val == 0 ) {
showAd();
return 0;
}
if (( val & 16 )==16) {
HspActivity.getInstance().showIntersAd();
return 0;
}
} else {
Log.i("HspActivity","callAdMob failed.");
}
return 0;
}
AndroidManifest.xml は以下のようになってます。(xxx は見本用のダミーです)
uses-permission あたりはアプリ内容によります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="14"
android:targetSdkVersion="28" />
<supports-screens android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<activity android:name="com.google.android.gms.ads.AdActivity"
android:theme="@android:style/Theme.Translucent"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
<activity android:name="tv.hsp.HspActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:label="@string/app_name">
<meta-data android:name="android.app.lib_name"
android:value="xxx" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-feature android:name="android.hardware.vibrate" android:required="false" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>
他所でもチラッと書いたのですが、結構重要なtips
AdMob広告が表示されている状態でend命令で終了すると、
結構な確率でエラーを吐いて終了します。
これは事前にAdMobを閉じて少しウエイトを入れてやることで解決します!
*exit
devcontrol "AdMob",-1 // AdMob非表示(これが無いとエラーが出ることがある)
await 100 // ウエイトを入れないとエラーになる
end
公式で直してほしいのですが・・・