Android アプリ開発「MATRIX」

Androidアプリの開発に役立つサンプル集


【最新版】既存のアプリにバナー広告を追加・表示する手順

既存アプリにバナー広告を追加して表示する 

今回は既存のアプリにバナー広告を追加する方法の説明です。

ざっと確認したところバナー広告を追加する基本的な方法は以前からあまり変わっていませんが、Google Mobile Ads SDKのバージョンが「17.0.0」の場合に限りマニフェストファイルに必ず追加しなければならない設定があるので注意が必要です。

それではバナー広告を表示する手順を説明します。

手順①「dependencies」の設定

まずは、「build.gradle」の「dependencies」にアプリ広告用のライブラリ「com.google.android.gms:pley-service-ads:xx.xx.x」が存在するのかを確認します。

<確認手順>アンドロイドスタジオのメニューから「File」→「Project Structure」をクリックして「Project Structure」画面を開き、①→②の順番で項目をクリックしてから③のアプリ広告用のライブラリが存在するかを確認します。 

アンドロイド開発「広告設定」
一覧に「com.google.android.gms:play-service-ads:xx.x.x」があるかを確認する

 

~ 広告用のライブラリが無い場合 ~

アプリ広告用のライブラリが無い場合は「Project Structure」画面の右上にある「+」アイコンをクリックすると表示されるメニューから「Library dependency」を選択して、ライブラリの追加選択画面を表示します。

アプリにバナー広告を表示する方法2

ライブラリの追加選択画面が表示されたら、その一覧の中から「com.google.android.gms:play-service-ads:xx.x.x」というライブラリを選択し、「OK」ボタンをクリックしてください。「Project Structure」画面を確認するとアプリ広告用のライブラリが追加されているはずです。

アプリにバナー広告を表示する方法3
バナー広告用のライブラリを追加する。

手順② マニフェストファイルに設定を追加

マニフェストファイルには以下の3つの設定を追加する必要があります。使用している「Google Mobile Ads SDK」のバージョンが「17.0.0」の場合は、2つ目の設定が必須になっています。

1.パーミッションの追加

<!-- 追加1パーミッション -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2.メタデータの追加

<!-- 追加2 Google Mobile Ads SDK 17.0.0 では必須 -->
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713" />

3.広告用アクティビティの追加

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

手順③ レイアウトファイルに「AdView」を追記

バナー広告を表示したいレイアウトファイルにバナー広告用の「AdView」を追加します。 ベースレイアウトは「RelativeLayout」を使用した方が良いようです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Hello World!" />

<!-- バナー広告用のビューを追加する -->
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-3940256099942544/6300978111" />
</RelativeLayout>

 

手順③ バナー広告の読み込みコードを追加

バナー広告用を表示したいアクティビティにバナー広告を読み込ませるためのコードを追加します。以前は「初期化」をする必要がなかったのですが、ここ最近になって「Mobile.initialize」で初期化するようになったようです。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//レイアウトファイルをセット
setContentView(R.layout.activity_main);
//初期化する
MobileAds.initialize(this,"ca-app-pub-3940256099942544/6300978111");
//レイアウトファイルにある広告用のビューを取得
AdView adView = (AdView) findViewById(R.id.adView);
//広告のリクエストをビルド
AdRequest adRequest = new AdRequest.Builder().setRequestAgent("Ads:Test").build();
//広告を読み込んで表示
adView.loadAd(adRequest);
}
}

実行結果

起動するとメインのアクティビティが表示され、その数秒後、画面の下部にバナー広告(テスト用)が表示されました。

アンドロイドアプリ広告テスト

まとめ

以前よりも何点か設定が増えていますが、バナー広告を表示するのはそれほど難しくはありません。

より詳しい内容については公式開発サイトで確認してみてください。

developers.google.com

END

インテントサービス(IntentService)の基本的な使い方

インテントサービスとは?

インテントサービスは停止するまでバックグラウンドで動き続ける通常のサービスと違い、処理が終わると「自動終了」してくれるので、いちいちサービスを停止させるコードを書く必要がありません。使い道はいろいろありますが、特にバックグラウンドでダウンロードさせる場合に最適なサービスだといえるでしょう。

インテントサービスを使用する時の注意点

インテントサービスの使い方は通常のサービスとほぼ同じですが、空のコンストラクターが必要になるので、以下の例のようなコンストラクターを必ずインテントサービス内に追加してください。これがないとマニフェストファイルにインテントサービスを追加した時のエラーが消えません。

//空のコンストラクターが必要
public MyIntentService() {
super(null);
}

もう一つ注意点があります。それは、インテントサービス内に「onHandleIntent」というオーバーライドメソッドを追加すると、引数部分にエラーの元になる「@androidx.annotation.Nullable」という文字が追加されるところです。これがあるとエラーが消えませんので、以下のように手動で削除してください。

@Override
protected void onHandleIntent(@androidx.annotation.Nullable Intent intent) {

   ↓↓↓ 赤字の部分を削除するとエラーは消える ↓↓↓

@Override
protected void onHandleIntent(Intent intent) {

本来は必要な文字列だとは思いますが、とりあえず削除すれば動くようになります。

サンプルコード①(MainActivity.java)

メインは、ボタンが押されるとインテントサービスにインテントを送信するだけの簡単な内容です。詳しい説明はコード内のコメントを参照してください。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//レイアウトファイルをビューにセット
setContentView(R.layout.activity_main);

//レイアウトファイルのボタンを取得してインスタンス化
Button button = (Button)findViewById(R.id.button);
//取得したボタンにクリックイベントをセット
button.setOnClickListener(new View.OnClickListener() {
//ボタンがクリックされた時の処理
@Override
public void onClick(View v) {
//起動するサービス名を登録したインテントを生成
Intent intent = new Intent(getBaseContext(),MyIntentService.class);
//インテントにアクションを追加セット
intent.setAction("TEST");
//インテントを送ってサービスを開始する
getBaseContext().startService(intent);
}
});
}
}

 

サンプルコード②(MyIntentService.java)

インテントサービスのコードです。空のコンストラクターを必ず追記します。

流れは、インテントを受け取ると10秒間隔の繰り返し処理が開始され、それを5回繰り返したところで、処理が終了するようになっています。

インテントサービスなので、サービスの停止処理はありません。

public class MyIntentService extends IntentService {

public MyIntentService(String name) {
super(name);
}

//空のコンストラクターが必要
public MyIntentService() {
super(null);
}

boolean hantei = true; //処理回数判定用
int kaisu = 0; //処理回数のカウント用

//インテントを受信した時に実行される
@Override
protected void onHandleIntent(Intent intent) {

//ログに出力
Log.d("TEST--->","" + intent.getAction() + "」を受信");

//処理内容
new Thread(new Runnable() {
@Override
public void run() {

//ログに出力
Log.d("TEST--->","処理を開始します");

//繰り返し処理
while (hantei) {
//カウントアップ
kaisu += 1;
//ログに出力
Log.d("TEST--->",kaisu + "");
//カウントアップの終了判定(5回で終了)
if(kaisu >= 5) {
//フラグを「false」にして終了させる
hantei = false;
}
//10秒間隔で処理を実行させるためにスリープさせている
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//ログに出力
Log.d("TEST--->","処理が終了しました");
}
}).start();
}
}

サンプルコード(AndroidManifest.xml)

マニフェストファイルにはインテントサービスを追加で登録してください。これを忘れるとプログラムがあっても正しく動きません。

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- インテントサービスを登録する -->
<service android:name=".MyIntentService" />
</application>

 

サンプルコード(main_activity.xml)

レイアウトは画面の中央に「Button」があるだけの単純なものです。

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<起動画面>

インテントサービスの使い方2

結果

画面中央に配置したボタンをクリックすると、インテントサービスが起動して10秒間隔でカウントアップする処理が開始され、5回繰り返すと処理をが終わりインテントサービスも終了します。処理の状況はアンドロイドスタジオのログ画面に表示されます。

インテントサービスの結果1

実行中にバックグラウンドプロセスを確認すると、インテントサービスが動いているのを確認することができます。

インテントサービスの使い方3

まとめ 

インテントサービスは停止処理を書く必要がなく通常のサービスより気軽に使用できますが、公式開発サイトでは、サービスは「Android 8.0(APIレベル26)」から課せられている「バックグラウンド実行制限」の影響を受けるため「JobIntentService」を使用する方が賢明だとしていますので、より多くの端末をターゲットにしなければならない場合は、APIレベルで処理を振り分ける必要がありそうです。

公式開発サイト<インテントサービス>

developer.android.com

END

リストビューに一覧表示したサウンドをタップ操作で再生させる方法

リストビューに一覧表示したサウンドをタップ操作で再生させる方法リスト表示したサウンドを再生させる

今回は、端末に内蔵されている着信音、通知音、アラーム音の名前を ListView に一覧で表示し、その一覧からタップされたサウンドが再生されるアプリを作ります。

必要なクラスやオブジェクトなどは以下です。

・RingtoneManager ・・・内蔵サウンドの管理
・Ringtone・・・サウンド操作(再生、ループ、停止など)
・Cursor・・・データの移動や参照など
・ListView・・・一覧表示を可能にするビュー
・ArrayList・・・リスト配列

サンプルコード① MainActivity.java

ポイントは、レイアウトファイルに配置した ListView に「OnClickListener」ではなく、「OnItemClickListener」を設定するところです。このリスナーを設定しないとリスト項目をタップしても反応しません。

また、アクティビティには ListView のクリックイベントを受け取るリスナー「OnItemClickListener」を実装(implements)しなければなりませんので、忘れないように注意してください。

それから、ListView に表示するサウンドの種類は「RingtoneManager.TYPE_ALL」の部分でフィルターができます。

・RingtoneManager.TYPE_ALL・・・すべて
・RingtoneManager.TYPE_ALARM・・・アラーム音
・RingtoneManager.TYPE_NOTIFICATION・・・通知音
・RingtoneManager.TYPE_RINGTONE・・・呼出音

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

//オブジェクトの準備
private RingtoneManager ringtoneManager; //リングトーンマネージャー
private Ringtone ringtone; //リングトーン

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//ビューにレイアウトファイルをセット
setContentView(R.layout.activity_main);
//配列変数を準備
ArrayList food = new ArrayList<>();
//リングトーンマネージャーを取得
ringtoneManager = new RingtoneManager(getApplicationContext());
//アラーム・通知音・呼び出し音のすべてを対象にする
ringtoneManager.setType(RingtoneManager.TYPE_ALL);
//リングトーンマネージャーのカーソルを作成
Cursor cursor = ringtoneManager.getCursor();
//カーソルを移動しながら処理を繰り返す
while(cursor.moveToNext()) {
//配列foodにサウンド名を追加する
food.add(cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX));
}
//レイアウトファイルにあるリストビューを取得
ListView listView = (ListView)findViewById(R.id.listview);
//リストビューにデータを
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,food);
//リストビューに配列アダプターをセット(リスト完成)
listView.setAdapter(adapter);
//リストビューにアイテムクリックリスナーをセット
listView.setOnItemClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//リングトーンマネージャーからリングトーンを取得
ringtone = ringtoneManager.getRingtone(position);
//再生中の判定
if (ringtone.isPlaying()) {
//再生中なら停止
ringtone.stop();
}
//サウンドを再生
ringtone.play();
}
}

 

サンプルコード② activity_main.xml

レイアウトファイルには ListView だけを配置してあります。

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />

実行結果

サンプルコードを実行すると、端末に内蔵されているサウンドの一覧が表示され、項目をタップするとそのサウンドがループ無しで再生されます。「通知音」は数秒の短いものが多く、「アラーム音」や「着信音」には長めのサウンドが多く存在します。

ListView の使い方

備考・その他

内蔵サウンドには1秒くらいの短いサウンドから延々にループしてしまうサウンドまであるので、単純に再生しただけではバランスが悪くなってしまうので、短いサウンドは「15秒間ループさせる」、また、延々とループするサウンドは「15秒で停止する」という処理を加えた方がグッと良くなるでしょう。

END

setAlarmClock で簡単なアラームを作る方法

setAlarmClock とは?

setAlarmClock は AlarmClockInfo でスケジュールされた時間に指定のペンディングインテントを実行するクラスです。この setAlarmClock はシステムが低電力アイドル状態(dozeモード)になっていても正確にトリガーされるので、正確な時間を必要とするアプリを作ることができますが、消費電力が大きいので使い過ぎないように注意する必要があります。このクラスはAPIレベル21以上で使用可能です。

setAlarmClock の使い方

このメソッドには2つの引数が必要になります。

alarmmanager.setAlarmClock( ① , ② );

① alarmclockinfo・・・発生時間をセットする
② pendingintent・・・実行するペンディングインテント

サンプルコード①(MainActivity.java)

サンプルコードの詳しい説明はコード内のコメントを参照してください。

public class MainActivity extends AppCompatActivity {

//ボタンオブジェクトを作成
public static Button button;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//アクティビティにレイアウトファイルをセット
setContentView(R.layout.activity_main);

//ボタンの生成とクリックイベントのセット
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//ベースコンテキストを取得
Context context = getBaseContext();
//アラームマネージャーの作成と設定
AlarmManager manager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
//インテントの作成
Intent intent = new Intent(context,SubActivity.class);
//ペンディングインテントの作成
PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,0);
//カレンダーの作成
Calendar calendar = Calendar.getInstance(); //現在時間が取得される
calendar.setTimeInMillis(System.currentTimeMillis() + 5000); //カレンダーを5秒進める
long alarm_time = calendar.getTimeInMillis(); //カレンダーをミリ秒に変換して変数に格納
//アラームクロックインフォを作成してアラーム時間をセット
AlarmManager.AlarmClockInfo clockInfo = new AlarmManager.AlarmClockInfo(alarm_time,null);
//アラームマネージャーにアラームクロックをセット
manager.setAlarmClock(clockInfo,pendingIntent);
//ボタンのテキストを変更
button.setText("タイマー作動中…");
}
});
}

//ボタンのテキストを変更するメソッド
public void Btn_text(String moji) {
//ボタンのテキストを変更
button.setText(moji);
}
}

サンプルコード②(SubActivity.xml)

タイマーが終了した時に起動するアクティビティです。

public class SubActivity extends Activity {

//メインアクティビティのオブジェクトを作成
private MainActivity mainActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//アクティビティにレイアウトファイルをセット
setContentView(R.layout.sub_activity);
}

@Override
protected void onDestroy() {
super.onDestroy();
//メインアクティビティをインスタンス化
mainActivity = new MainActivity();
//ボタンのテキストを変更
mainActivity.Btn_text("クリック");
}
}

サンプルコード③(activity_main.xml、sub_activity.xml)

レイアウトファイルはどちらも画面の中央に Button または TextView を配置しただけのシンプルなものです。

activity_main.xml

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="クリック"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

sub_activity.xml

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="時間です!"
android:textColor="@color/colorPrimary"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

サンプルコード④(AndroidManifest.xml)

マニフェストファイルにはアラームが作動した時に表示するアクティビティを追加します。

<!-- アクティビティを追加登録 -->
<activity android:name=".SubActivity" />

 

サンプルの実行

① 起動すると画面の中央にボタンが表示されます。

setAlarmClock で簡単にアラームを作る方法1

 

② ボタンをクリックすると5秒のタイマーが作動して、通知エリアに「タイマーアイコン」が表示されます。

setAlarmClock で簡単にアラームを作る方法2

 

③ 5秒経過すると予備のアクティビティが起動して予定の時間が経過したことを知らせます。

setAlarmClock で簡単にアラームを作る方法3

備考・その他

より詳しい使い方は公式開発者サイトを参照ください。

developer.android.com

END

カレンダー「Calendar」の基本的な使い方のまとめ

カレンダー「Calendar」とは?

カレンダーは、セットした日時の「1970年1月1日00:00:00 GMT からの経過時間」をミリ秒で取得することができるクラスです。またその逆に、取得したりセットした特定日時のミリ秒から年月日や時間を取得することも可能です。

<基本的な使い方>

① カレンダーを生成してインスタンス化

インスタンス化した時点で calendar には「現在時間」がセットされます。

Calendar calendar = Calendar.getInstance();

② カレンダーに任意の日時をセット

calendar.setTimeInMillis(System.currentIimeMillis()); //システムの現在時間をセット
calendar.set(2019,5,5,8,0,15); //年月日時分秒をセット
calendar.set(2020,6,20,19,30); //年月日時分をセット
calendar.set(2001,3,10); //年月日をセット

③ カレンダーの操作

calendar.add(Calendar.YEAR,5); //カレンダーを5年進める
calendar.add(Calendar.DATE,-20); //20日前に戻す
calendar.add(12,8); //8分進める
calendar.add(4,1); //1週間(7日)進める

add() で操作できる主な日時設定

int カレンダーフィールド 備考
1 Calendar.YEAR
2 Calendar.MONTH
5 Calendar.DATE
4 Calendar.WEEK_OF_MONTH
7 Calendar.DAY_OF_WEEK 曜日
11 Calendar.HOUR_OF_DAY
12 Calendar.MINUTE
13 Calendar.SECOND
14 Calendar.MILLISECOND ミリ秒
     

④ 値を取得する

カレンダーオブジェクトから値を取得するには get() メソッドを利用します。

int value = calender.get(1); //「年」を取得
int value = calender.get(Calendar.YEAR); //「年」を取得

get() で取得できる値

取得内容

int 取得方法 取得できる値
1 get(Calendar.YEAR) 整数4桁
2 get(Calendar.MONTH) 0~11
5 get(Calendar.DATE) 1~31
11
10
get(Calendar.HOUR_OF_DAY)
get(Calendar.HOUR)
0~23
0~11
12 get(Calendar.MINUTE) 0~59
13 get(Calendar.SECOND) 0~59
ミリ秒 14 get(Calendar.MILLISECOND) 整数3桁
       

その他の値も取得することができます。

取得内容 記述方法 取得結果
Date getTime() Sat Mar 09 07:46:29 GMT 2019
TimeZone getTimeZone() .getId → "GMT"
.getDisplayName → "Greenwich Mean Time"
long getTimeInMillis() 1552118677691(整数13桁)
     

 

サンプル

現在から東京オリンピックが開催される「2020年7月24日」までの日数を計算するサンプルです。 

Calendar calendar = Calendar.getInstance(); //カレンダーを生成
calendar.setTimeInMillis(System.currentTimeMillis(); //システム時間をセット
long genzai = calendar.getTimeInMillis(); //ミリ秒で取得
calendar.set(2020,7,24); //年月日をセット
long mirai = calendar.getTimeInMillis(); //未来の日時をミリ秒で取得
long diff = mirai - genzai; //未来と現在の時間差をミリ秒で計算
long nissu = diff / (1000 * 60 * 60 * 24); //ミリ秒を日数に変換

備考・その他

 カレンダーについてのより詳しい解説は公式開発サイトを参照ください。

developer.android.com

END