5: 2016-07-20 (水) 16:36:21 njf[6] [7] [8] | 現: 2019-04-25 (木) 19:27:54 njf[6] [9] [10] | ||
---|---|---|---|
Line 2: | Line 2: | ||
まず、通常のAndroidアプリで広告を表示できないとANEを作成することはできません。ここではAndroidアプリでAdmobの広告を表示し、そこから必要なファイルを抜き出す方法を紹介します。 | まず、通常のAndroidアプリで広告を表示できないとANEを作成することはできません。ここではAndroidアプリでAdmobの広告を表示し、そこから必要なファイルを抜き出す方法を紹介します。 | ||
- | こちらの内容は「[[AndroidでのANEの作成1_Android側の作成]]」にそった方法で行いますので、そちらも参考にして下さい。 | + | こちらの内容は「[[AndroidでのANEの作成/Android側の作成]]」にそった方法で行いますので、そちらも参考にして下さい。 |
また、こちらではAdmobの広告IDを使いますので、あらかじめテスト用のAndroidのアプリの登録とそのID、バナー広告用のID、インタースティシャル広告のIDを用意しておいて下さい。 | また、こちらではAdmobの広告IDを使いますので、あらかじめテスト用のAndroidのアプリの登録とそのID、バナー広告用のID、インタースティシャル広告のIDを用意しておいて下さい。 | ||
Line 76: | Line 76: | ||
Finishボタンを押せばライブラリが作成されます。 | Finishボタンを押せばライブラリが作成されます。 | ||
- | *Google Play Servicesの追加 [#ua4e58f1] | + | *Google Play Servicesの追加 (現在は不要)[#ua4e58f1] |
+ | &font(Red){----アップデートにより、このセクションの手順は意味がなくなったので飛ばしてください-----&br;}; | ||
(この部分については[[公式ページ:https://developers.google.com/mobile-ads-sdk/docs/admob/android/quick-start?hl=ja]]も参考にして下さい。) | (この部分については[[公式ページ:https://developers.google.com/mobile-ads-sdk/docs/admob/android/quick-start?hl=ja]]も参考にして下さい。) | ||
Line 164: | Line 165: | ||
} | } | ||
- | 次にアプリケーションのIDを設定するメソッドです。これは広告を表示する前に必ず一度実行する必要があります。 | + | 次にアプリケーションのIDを設定するメソッドです。これは広告を表示する前であることはもちろん、他のIDを設定する前に必ず一度実行する必要があります。 |
public void setAppID(String appID){ | public void setAppID(String appID){ | ||
Line 186: | Line 187: | ||
} | } | ||
} | } | ||
+ | バナーが二つ表示されるとやっかいなので、一度しか初期化できないようにif文でくくられています。 | ||
ここでsetBackgroundColorを使って背景色を黒にしています。 | ここでsetBackgroundColorを使って背景色を黒にしています。 | ||
これはまれに広告のロードが終わっても画像が表示されず、透明のままになることがあり、するとユーザーの誤クリックを誘発しやすくなることを防ぐためです。 | これはまれに広告のロードが終わっても画像が表示されず、透明のままになることがあり、するとユーザーの誤クリックを誘発しやすくなることを防ぐためです。 | ||
Line 211: | Line 213: | ||
bannerView.setVisibility(AdView.GONE); | bannerView.setVisibility(AdView.GONE); | ||
} | } | ||
+ | |||
+ | 通常、バナー広告は数十秒〜数分ごとに更新されます。 | ||
+ | AdViewのpauseメソッドはこの更新を止めます。 | ||
+ | バナーを消すと更新は不要なので呼び出しています。 | ||
+ | |||
+ | アプリがバックグラウンドにまわったときも、余計な負荷を除くため、このpauseメソッドを呼び出し、再び前にまわったらresumeメソッドを呼び出すことをお勧めします。 | ||
+ | |||
+ | ここの例では、単にバックグラウンドでhideBannerを、前にきたらshowBannerを呼び出すと良いでしょう。 | ||
+ | |||
ここでmakeAdRequestメソッドは広告用のリクエストを作るメソッドです。 | ここでmakeAdRequestメソッドは広告用のリクエストを作るメソッドです。 | ||
Line 218: | Line 229: | ||
} | } | ||
- | これはインタースティシャル広告でも使うのでメソッドにしています。また、AdRequest作り方を | + | 一行しかありませんが、インタースティシャル広告でも使うのでメソッドにしています。また、AdRequestの作り方を |
return new AdRequest.Builder().addTestDevice("デバイスID").build(); | return new AdRequest.Builder().addTestDevice("デバイスID").build(); | ||
とするとテスト用の広告が表示されるようになります。 | とするとテスト用の広告が表示されるようになります。 | ||
Line 225: | Line 236: | ||
といった感じで表示されるので探してみて下さい。 | といった感じで表示されるので探してみて下さい。 | ||
- | Admobは開発者が自ら広告をタップするのを禁止しています。 | + | Admobは開発者が自ら広告をタップしたり、開発時に実際の広告を表示するのを禁止しています。 |
- | 現実的に一度や二度ほどタップしたからいきなり問題が生じることはありませんが、何度も誤タップしてしまうとなんらかのペナルティがある可能性があります。 | + | 現実的には少々テストで表示したり、一度や二度ほどタップしたからいきなり問題が生じることはありませんが、何度も表示したり誤タップしてしまうとアカウント停止などのなんらかのペナルティがある可能性があります。 |
- | テスト時にうっかりタップしないようにするため、このようにテスト用デバイスを設定することをお勧めします。 | + | そのため、テスト時にはこのようにテスト用デバイスを設定することをお勧めします。 |
また、その時のためにこのようにAdRequestを作成するメソッドは別に用意しておいた方が、一カ所直せば良いので便利です。 | また、その時のためにこのようにAdRequestを作成するメソッドは別に用意しておいた方が、一カ所直せば良いので便利です。 | ||
Line 247: | Line 258: | ||
} | } | ||
} | } | ||
+ | |||
+ | isLoadedはロード完了かどうかを判定するメソッドです。 | ||
+ | |||
+ | インタースティシャルは規約的にも注意するのは表示させすぎないぐらいで、それほど難しい部分はありません。 | ||
*Androidアプリとしてのテスト [#w2a72b1c] | *Androidアプリとしてのテスト [#w2a72b1c] | ||
Line 259: | Line 274: | ||
<uses-permission android:name="android.permission.INTERNET"/> | <uses-permission android:name="android.permission.INTERNET"/> | ||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> | ||
+ | |||
+ | 同じくAndroidManifest.xmlのapplicationタグの中に次を入れます。 | ||
+ | |||
+ | <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:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" | ||
+ | android:theme="@android:style/Theme.Translucent" /> | ||
+ | |||
+ | |||
あとはonCreateメソッドにボタンを押したときの処理を入れます。 | あとはonCreateメソッドにボタンを押したときの処理を入れます。 | ||
Line 266: | Line 291: | ||
super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||
setContentView(R.layout.activity_main); | setContentView(R.layout.activity_main); | ||
+ | |||
aneAdmob = new ANEAdmob(this); | aneAdmob = new ANEAdmob(this); | ||
+ | |||
aneAdmob.setAppID(APP_ID); | aneAdmob.setAppID(APP_ID); | ||
aneAdmob.setBannerID(BANNER_ID); | aneAdmob.setBannerID(BANNER_ID); | ||
aneAdmob.setInterstitialID(INTER_ID); | aneAdmob.setInterstitialID(INTER_ID); | ||
+ | |||
Button button = (Button) findViewById(R.id.showBannerBtn); | Button button = (Button) findViewById(R.id.showBannerBtn); | ||
+ | |||
assert button != null; | assert button != null; | ||
button.setOnClickListener(new View.OnClickListener() { | button.setOnClickListener(new View.OnClickListener() { | ||
Line 281: | Line 306: | ||
aneAdmob.showBanner(); | aneAdmob.showBanner(); | ||
} | } | ||
+ | |||
} | } | ||
); | ); | ||
+ | |||
button = (Button) findViewById(R.id.hideBannerBtn); | button = (Button) findViewById(R.id.hideBannerBtn); | ||
+ | |||
assert button != null; | assert button != null; | ||
button.setOnClickListener(new View.OnClickListener() { | button.setOnClickListener(new View.OnClickListener() { | ||
Line 293: | Line 318: | ||
aneAdmob.hideBanner(); | aneAdmob.hideBanner(); | ||
} | } | ||
+ | |||
} | } | ||
); | ); | ||
button = (Button) findViewById(R.id.loadInterstitialBtn); | button = (Button) findViewById(R.id.loadInterstitialBtn); | ||
+ | |||
assert button != null; | assert button != null; | ||
button.setOnClickListener(new View.OnClickListener() { | button.setOnClickListener(new View.OnClickListener() { | ||
Line 304: | Line 329: | ||
aneAdmob.loadInterstitial(); | aneAdmob.loadInterstitial(); | ||
} | } | ||
+ | |||
} | } | ||
); | ); | ||
+ | |||
button = (Button) findViewById(R.id.showInterstitialBtn); | button = (Button) findViewById(R.id.showInterstitialBtn); | ||
+ | |||
assert button != null; | assert button != null; | ||
button.setOnClickListener(new View.OnClickListener() { | button.setOnClickListener(new View.OnClickListener() { | ||
Line 316: | Line 341: | ||
aneAdmob.showInterstitial(); | aneAdmob.showInterstitial(); | ||
} | } | ||
+ | |||
} | } | ||
); | ); | ||
+ | |||
} | } | ||
これでテスト可能です。 | これでテスト可能です。 | ||
+ | |||
+ | これで動かないと当然ながらANEにしたところで動きません。ANEへの変換は手間がかかるので、作業を能率化するにはこの段階で入念にテストしておく必要があります。 | ||
*ANE呼び出し処理の追加 [#i5cd3b6c] | *ANE呼び出し処理の追加 [#i5cd3b6c] | ||
Line 328: | Line 355: | ||
Android上で問題なく実行されたら、ANEにするための処理を入れます。 | Android上で問題なく実行されたら、ANEにするための処理を入れます。 | ||
- | [[こちらを参考に:http://njf.jp/cms/modules/xpwiki/?Android%E3%81%A7%E3%81%AEANE%E3%81%AE%E4%BD%9C%E6%88%901_Android%E5%81%B4%E3%81%AE%E4%BD%9C%E6%88%90#a17e7947]]FlashRuntimeExtensions.jarをaneadmobの下のlibに配置します。 | + | [[こちらを参考に:http://njf.jp/cms/modules/xpwiki/?Android%E3%81%A7%E3%81%AEANE%E3%81%AE%E4%BD%9C%E6%88%90%2FAndroid%E5%81%B4%E3%81%AE%E4%BD%9C%E6%88%90#a17e7947]]FlashRuntimeExtensions.jarをaneadmobの下のlibに配置します。 |
+ | |||
+ | 最終的にaneadmobのbuild.gradleのdependencies以下に次の一行が挿入されていればOKです。 | ||
+ | |||
+ | compile files('libs/FlashRuntimeExtensions.jar') | ||
+ | |||
+ | 次にActionScriptから呼び出される部分を作ります。 | ||
+ | |||
+ | 呼び出しには次の二つのクラスが必要です。 | ||
+ | |||
+ | |名前|機能|インターフェイス| | ||
+ | |ANEAdmobFREExtension|呼び出しの定義と振り分け処理|FREExtension| | ||
+ | |ANEAdmobFREFunction|実際に呼び出される関数|FREFunction| | ||
+ | |||
+ | ここではこれらのクラスをjp.njf.aneadmobパッケージとして制作します。 | ||
+ | |||
+ | ここで呼び出されるクラスの設計には二つの選択肢があります。 | ||
+ | 呼び出される関数はFREFunctionをimplementsしておくと、その中のcallメソッドが呼ばれます。 | ||
+ | |||
+ | よって呼び出しメソッドの数だけクラスを作るか、一つのクラスを作って内部的に振り分けるか、という設計があり得ます。 | ||
+ | |||
+ | 前節のように、このANEには7つのメソッドがあるので、7つもクラスを作るのは面倒です。よって一つのクラスを作って第一引数を使って処理の分岐を行うようにします。そのクラスが上記のANEAdmobFREFunctionで、メソッドの数だけクラスがないのはそのためです。 | ||
+ | |||
+ | ただし、メソッドごとにクラスを作った方が呼び出しエラーなどがFlash側のtraceメッセージなどと一緒に表示されるため、デバッグは楽です。自分で振り分けする場合は、もちろん自分でエラー処理もしなくてはなりません。 | ||
+ | |||
+ | このように一長一短ありますので、場合に応じて設計を変えて下さい。 | ||
+ | |||
+ | |||
+ | |||
+ | まずANEAdmobFREExtensionクラスのcreateContextメソッドです。"admob"という名前で呼び出せるようにしておきます。 | ||
+ | |||
+ | @Override | ||
+ | public FREContext createContext(String s) { | ||
+ | FREContext context = new FREContext() { | ||
+ | @Override | ||
+ | public Map<String, FREFunction> getFunctions() { | ||
+ | Map<String, FREFunction> result = new HashMap<String, FREFunction>(); | ||
+ | result.put("admob", new ANEAdmobFREFunction()); | ||
+ | return result; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void dispose() { | ||
+ | |||
+ | } | ||
+ | }; | ||
+ | return context; | ||
+ | } | ||
+ | |||
+ | 特に難しい部分はないはずです。分からない部分があれば「[[AndroidでのANEの作成/Android側の作成]]」を参照してください。 | ||
+ | |||
+ | 次にANEAdmobFREFunctionのcallメソッドです。 | ||
+ | 第一引数をメソッドの振り分けに、第二引数をパラメータとして使っています。 | ||
+ | |||
+ | public FREObject call(FREContext freContext, FREObject[] freObjects) { | ||
+ | String method = ""; | ||
+ | String prm = ""; | ||
+ | try { | ||
+ | method = freObjects[0].getAsString(); | ||
+ | } catch (Exception e) { | ||
+ | Log.e("njf.jp.aneadmob", "ANEAdmobFREFunction:can't parse : arg 0"); | ||
+ | } | ||
+ | try { | ||
+ | prm = freObjects[1].getAsString(); | ||
+ | } catch (Exception e) { | ||
+ | Log.w("njf.jp.aneadmob", "ANEAdmobFREFunction:can't parse : arg 1"); | ||
+ | } | ||
+ | |||
+ | if(aneAdmob == null){ | ||
+ | aneAdmob = new ANEAdmob(freContext.getActivity()); | ||
+ | } | ||
+ | |||
+ | if(method.equals("setAppID") && !prm.equals("")){ | ||
+ | aneAdmob.setAppID(prm); | ||
+ | }else if(method.equals("setBannerID") && !prm.equals("")){ | ||
+ | aneAdmob.setBannerID(prm); | ||
+ | }else if(method.equals("setInterstitialID") && !prm.equals("")){ | ||
+ | aneAdmob.setInterstitialID(prm); | ||
+ | }else if(method.equals("showBanner")){ | ||
+ | aneAdmob.showBanner(); | ||
+ | }else if(method.equals("hideBanner")){ | ||
+ | aneAdmob.hideBanner(); | ||
+ | }else if(method.equals("showInterstitial")){ | ||
+ | aneAdmob.showInterstitial(); | ||
+ | }else if(method.equals("loadInterstitial")){ | ||
+ | aneAdmob.loadInterstitial(); | ||
+ | }else{ | ||
+ | Log.e("njf.jp.aneadmob", "ANEAdmobFREFunction:no method or invalid prm " + method); | ||
+ | } | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | |||
+ | こちらも分からない部分があれば「[[AndroidでのANEの作成/Android側の作成]]」を参照してください。 | ||
+ | |||
+ | *jarファイルの取り出し [#re49287b] | ||
+ | |||
+ | jarファイルの取り出しについては、[[こちらの記事:http://njf.jp/cms/modules/xpwiki/?Android%E3%81%A7%E3%81%AEANE%E3%81%AE%E4%BD%9C%E6%88%90%2FAndroid%E5%81%B4%E3%81%AE%E4%BD%9C%E6%88%90#veeed4bc]]と同じです。 | ||
+ | ツールバーの「Build->Rebuild Project」でビルドし直して、aneadmob-release.aarファイルを探し出し、zip解凍してください。必要なのは「classes.jar」のみです。 | ||
- | 制作中 | + | ---- |
+ | -[[AndroidでのAdmobのANEの作成]]にもどる | ||
+ | -[[AndroidでのAdmobのANEの作成_swcの作成]]に進む |
(This host) = https://njf.jp