Android アプリ開発 「MATRIX」

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



タイマー関数を使ってカウントアップアプリを作ってみよう

タイマー関数を使ってカウントアップアプリを作ってみました。

難しいところはありませんが、タイマータスクから直接メインUIスレッドにあるオブジェクト(TextView や Button)にはアクセスできないので、Handler を使って間接的にアクセスするようにします。

※Handler というのは、メインUIスレッドに情報を送るベルトコンベヤーみたいなもので、命令を送ればそれを順番に実行してくれる便利なものです。

<サンプルコード> MainActivity.java 

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

private Button button1; //ボタンのインスタンス
private TextView textView1; //テキストビューのインスタンス
private Timer timer1; //タイマーのインスタンス
private TimerTask timerTask1; //タイマータスクのインスタンス
private int count; //カウント用変数

//メインスレッドにアクセスするためのハンドラーを生成
private android.os.Handler handler1 = new android.os.Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//button1にレイアウトファイルのボタンを割り当てる
button1 = (Button)findViewById(R.id.button);
//textView1にレイアウトファイルのテキストビューを割り当てる
textView1 = (TextView)findViewById(R.id.textview);

//button1にクリックイベントのリスナーをセットしてクリック時の動作も設定する
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

//timer1が動いている時
if(timer1 != null){
//タイマーを停止
timer1.cancel();
//タイマーを破棄
timer1 = null;
} else { //timer1が停止していた時
//新しいタイマーを生成
timer1 = new Timer();
//タイマー作動時の動作を新規に登録
timerTask1 = new Task1();
//1秒後に1秒おきにtimerTask1の処理を実行するタイマーを起動
timer1.schedule(timerTask1, 1000, 1000);
}
}
});
}

//ここでタイマー作動時の動作をプログラムしている
public class Task1 extends TimerTask{
@Override
public void run() {
//メインスレッドに情報を送る
handler1.post(new Runnable() {
@Override
public void run() {
//タイマー作動時の実際の動作(カウントアップ)
count += 1;
//テキストビューに現在のカウント値を表示する
textView1.setText(String.valueOf(count));
}
});
}
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="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="com.example.android.mysample.MainActivity">

<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="150sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_bias="0.501"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/button" />

<Button
android:id="@+id/button"
android:layout_width="368dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:height="100dp"
android:text="スタート/ストップ"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />

</android.support.constraint.ConstraintLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.mysample">

<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>
</application>

</manifest>

<結果>

「スタート/ストップ」ボタンを押すと1秒おきにカウントアップを始め、もう一度「スタート/ストップ」ボタンを押すとカウントアップが停止します。

これをもとにすれば、簡単なタイマーやストップウォッチが作れると思います。

f:id:vw-dsg:20170529203436p:plain

 

END

ボタンがクリックされた時に処理が行われるようにする方法

レイアウト画面でボタンを置いてもクリックを監視するリスナーを登録しなければ、ボタンが押されるだけで何も起こりませんね。ボタンのクリックイベントを取得する方法はいくつかありますが、今回はボタンに直接クリックリスナーを登録する方法を紹介します。

 

<サンプルコード>

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);
//テキストビューをインスタンス化すると同時にレイアウトにあるテキストビューを登録
final TextView textView = (TextView)findViewById(R.id.mojimoji);

//ボタンにクリックを監視するリスナーをセットする。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//ボタンが押された時の処理を書く
textView.setText("ボタンが押されたよ!");
}
});
}
}

<結果>

f:id:vw-dsg:20161119010156p:plain

中央のボタンを押すとメッセージが表示されました。

 

END 

 

自作アプリにAdMobのインタースティシャル広告を表示する手順

画面の下の方に表示される控えめなバナー広告と違い、インタースティシャルは画面いっぱいにいきなり広告が表示されるので、あまり頻繁に表示しない方が良いかもしれませんね。

 

 1.Google Play開発者サービスSDKをダウンロード

Android Studioの「SDKマネージャー」を開いて、下の方の「Extras」にある「Google Play services」にチェックを入れて右下のインストールボタンを押す。

※既にインストールされている場合はこの手順は行う必要はありません。

 

2.AndroidManifest.xml に以下を追加

<1> インターネットアクセスに関する設定 

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<2> グーグルプレイに関する設定

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

 

3.インタースティシャル広告を表示するActivity(サンプル)

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

//広告表示に関係するインポート
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;

public class MainActivity extends AppCompatActivity {

//広告の使用宣言
InterstitialAd interstitialAd;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

interstitialAd = new InterstitialAd(this); //インスタンス
interstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); //テスト用広告ID
loadInterstitial(); //Interstitial広告の読み込み開始

//広告状態のリスナー
interstitialAd.setAdListener(new AdListener() {

//広告が閉じられた時
@Override
public void onAdClosed() {
super.onAdClosed();
}

//広告がロードできた時
@Override
public void onAdLoaded() {
super.onAdLoaded();
showInterstitial();
}

//広告がロードできなかった時
@Override
public void onAdFailedToLoad(int i) {
super.onAdFailedToLoad(i);
}
});
}

//広告をロードする
private void loadInterstitial() {
AdRequest adRequest = new AdRequest.Builder().setRequestAgent("AdTest").build(); //広告ビルダーをビルド
interstitialAd.loadAd(adRequest); //広告のロード開始
}
//広告を表示する
private void showInterstitial() {
//広告がnullではない+広告が読み込まれている場合
if(interstitialAd != null && interstitialAd.isLoaded()) {
interstitialAd.show(); //広告の表示
}
}
}

 

4.結果

f:id:vw-dsg:20161012071153p:plain

 

画面いっぱいにインタースティシャル広告が表示されました。

 

END

 

自作アプリにAdMobのバナー広告を表示する手順

 

 1.Google Play開発者サービスSDKをダウンロード

Android Studioの「SDKマネージャー」を開いて、下の方の「Extras」にある「Google Play services」にチェックを入れて右下のインストールボタンを押す。

※既にインストールされている場合はこの手順は行う必要はありません。

 

2.AndroidManifest.xml に以下を追加

<1> インターネットアクセス設定 

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<2> グーグルプレイ設定

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

<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" />

 

3.レイアウトxml ファイルに以下を追加

xmlns:ads="http://schemas.android.com/apk/res-auto"
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-3940256099942544/6300978111"> //これはテスト用バナーID
</com.google.android.gms.ads.AdView>

 

4.表示するActivity に以下を追加 

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;

onCreate 内に追加

AdView adView = (AdView)findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);

 

5.結果

f:id:vw-dsg:20161009193715p:plain

 

下部にテスト用のバナー広告が表示されました。

 

END

 

Android Studioの動作がおかしくなったら

Android Studioの動作がおかしくなったら

Android Studioは時々動作が変になるときがありますね。

例えば、何度修正してもエラーが消えなかったり、更新しても実機やエミュレータに反映されなかったり、何も変更していないファイルにエラーが発見されたり・・・。

と、時々ですがわけのわからない状態に陥りますが、そんな時はどうすれば良いのでしょう?

 

その答えは・・・そう、万能薬の「再起動」。。。

 

まず、Android Studioだけを再起動して様子を見てみます。それでも改善しない時はPCの再起動をしてみる。

 

開発中だとブラウザやメモ帳やフォルダなどなど、あれこれ10個以上のウィンドウが開いているので、できればPCの再起動はやりたくないのですが・・・こればっかりは仕方ありませんね。

 

END

 

APKの作成中に「64K・・・」関連のエラーが出た場合の対処方法

テスト中は問題なかったのにAPKを作成しようとしたら「64K・・・」という感じのエラーが出て困ったことがこれまでに2度ほどあった。原因はよくわからないが、他のサイトをみるとどうもアプリが太ってくると(コードが増えてくると)発生してしまうらしい。

対処方法は、Android Studioの公式サイトにもあって「build.gradle」と「AndroidManifest.xml」に3行ほど追加すればよいとのこと。

 

<build.gradle> ※2行追加

android {
compileSdkVersion 23
buildToolsVersion '23.0.1'
defaultConfig {
applicationId "com.android.soft"
minSdkVersion 11
targetSdkVersion 22
versionCode 1
versionName "1.0"

multiDexEnabled true //これを追加する
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.0.0-alpha2'
compile 'com.google.android.gms:play-services:9.2.1'
compile 'com.google.android.gms:play-services-maps:9.2.1'
compile 'com.android.support:support-v4:23.3.0'

compile 'com.android.support:multidex:1.0.0' //これを追加する
}

 

<AndroidManifest.xml> ※applicationゾーンに1行追加

android:name="android.support.multidex.MultiDexApplication" //これを追加する

 

これでAPKが正常に作成されるようになる場合があるので、困ったときは試してください。

 

END

 

getSpeed()で移動速度を取得する

移動速度を取得するにはLocationクラスの「getSpeed」メソッドを利用する。

取得できるのは「メートル/秒(m/s)」のFloatとなる。

Float sokudo;
sokudo = location.getSpeed();

 

END