Android アプリ開発 「MATRIX」

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

Android開発レシピ 「ヒープサイズエラーが出た時の対処方法」

開発する端末を変えると、下記のような「ヒープサイズ(heep size)」に関係するエラーが出てしまい開発ができなくなってしまう場合があります。(例:デスクトップで作り始めたアプリをノートPCで持ち出して開発する場合など)

 

<ヒープサイズエラー例> 

Error:Unable to start the daemon process: could not reserve enough space for object heap. Please assign more memory to Gradle in the project's gradle.properties file. For example, the following line, in the gradle.properties file, sets the maximum Java heap size to 1,024 MB:
org.gradle.jvmargs=-Xmx1024m
Read Gradle's configuration guide
Read about Java's heap size

 

もしこの手のエラーが出た時には、赤色の部分のコードを「gradle.properties」ファイルの最後に追加してあげると解決する場合があります。「gradle.properties」ファイルは画面左にあるプロジェクトエクスプローラーの中に存在します。

<gradle.properties>

# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

org.gradle.jvmargs=-Xmx1024m ←追加

以上、ぜひ試してみてください。 

 

END 

 

Android開発レシピ 「GPSで緯度と経度を取得して画面に表示する方法」

余分なコードはほとんどありません。単純にGPSで緯度と経度を取得して画面に表示するシンプルな方法です。ぜひ参考にしてください。

<サンプルコード>

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

//メインアクティビティー ※implementsでロケーションの変化を受信できるようにする
public class MainActivity extends AppCompatActivity implements LocationListener {

private LocationManager locationManager; //ロケーションマネージャー
private TextView textView; //テキストビューの取得

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

//ロケーションマネージャーを設定
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
//テキストビューを登録
textView = (TextView)findViewById(R.id.textView);
//テキストビューに文字を設定
textView.setText("GPS準備中…"); //GPSが作動するまで表示される
}

@Override
protected void onResume() { //アプリの再開時
super.onResume();
//開始時にGPS情報の更新をロケーションマネージャーに登録
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}

@Override
protected void onPause() { //アプリの停止時
super.onPause();
//終了時にロケーションマネージャーからGPS情報の更新を削除
locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {
//GPS情報の更新を受信したらテキストビューに緯度と経度として表示する
textView.setText("緯度:" + location.getLatitude() + System.getProperty("line.separator") + "経度:" + location.getLongitude());
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
//今回未使用
}

@Override
public void onProviderEnabled(String provider) {
//今回未使用
}

@Override
public void onProviderDisabled(String provider) {
//今回未使用
}
}

 

マニフェストファイル>

GPSを利用するにはマニフェストに下記の一行が必要なのでお忘れなく。

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

 

<結果>

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

 

<注意事項>

この方法が使えるのはAPIのターゲットが22までの場合です。APIのターゲットが23以上になると、ユーザーにGPSの使用許可を得るコードを記述しなければならなくなります。

アプリのターゲットAPIは、「ファイル」→「Project structure」→左側メニューの一番下「app」を選択→「Flavors」タブ→「Target Sdk Version」項目で「API22」以下を選択する。

 

END

 

Android開発レシピ 「Javaコードで動的にレイアウト画面を作成する方法」

これは、レイアウトxmlファイルを使わずに、Javaコードで動的にレイアウト画面を作成する方法です。レイアウトxmlファイルのように実行する前に確認はできませんが、場合によってはこの方法を利用した方が楽になります。

<サンプルコード>

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

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

//コードでレイアウトを生成&セット
LinearLayout linearLayout = new LinearLayout(this); //1.リニアレイアウトをインスタンス
linearLayout.setBackgroundColor(Color.WHITE); //2.背景色の指定
setContentView(linearLayout); //3.レイアウトをコンテントに表示する

//コードでテキストビューを生成&セット
TextView textView = new TextView(this); //4.テキストビューのインスタンスを生成
textView.setText("TEST OK!"); //5.表示する文字をセット
textView.setTextSize(50); //6.テキストのサイズをセット
textView.setTextColor(Color.RED); //7.テキストの色をセット
linearLayout.addView(textView); //8.レイアウトにテキストビューを追加して表示する
}
}

3の時点で何もない真っ白な画面が作られます。4~7でテキストビューを準備し、8で先に作ったレイアウトにテキストビューを追加・表示しています。

このコード内の「this」というのは「Context」を意味しているので、ここはContextを取得するコード「getBaseContext()」に書き換えても問題ありません。

 

<結果>

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

 

END

 

Android開発レシピ ~ String.format ~ 「小数を任意の桁数で切り捨て表示する」

小数を任意の桁数で切り捨て表示するには、「String.format」関数を使います。

<サンプルコード>

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

public class MainActivity extends AppCompatActivity {

float a = 0.1234567f;

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

TextView textView = (TextView)findViewById(R.id.textView);
String b = String.format("%.3f", a);

textView.setText(b);
}
}

String.format("%.3f", a)の中の「3」のところが小数点以下の桁数を指定しているところです。桁数を変えたい場合はここの数値を変更します。

数値の横に「f」が付いていますが、これは「float」の「f」を意味しています。これが無いとエラーでアプリが落ちるので気を付けましょう。

<結果>

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

 

END

 

Android開発レシピ ~ OnClickListener ~ 「ボタンにクリックイベントを設定する方法」

ボタンにクリックイベントを設定する2種類の方法です。まず、適当にボタンを2つ配置したレイアウトを作成します。

 

<サンプル画面>

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

 

下記のサンプルのようにコードを記述します。

 

<サンプルコード>

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

//Buttonのインスタンス(button)にボタンを登録
Button button1 = (Button)findViewById(R.id.button1);
//その1 ボタン1にクリックイベントを設定
button1.setOnClickListener(this);

//その2 ボタン2にクリックイベントを設定
findViewById(R.id.button2).setOnClickListener(this);
}

//ボタンがクリックされると呼び出される
@Override
public void onClick(View v) {
Log.d("Message;", "ボタンがクリックされました(ボタンID:" + v.getId() + ")");
}
}

ボタンをクリックすると「Android Monitor」にログが出力されます。 

 

その1では、インスタンス(button1)にクリックイベントを設定していますが、その2では、button2に直接クリックイベントを設定しています。

ボタンのスタイルを変更せず単純にボタンのクリックを取得するだけなら、その2の方法が簡単で良いかもしれません。

 

END

 

Android開発レシピ ~ SoundPool ~ 「ボタンクリックで効果音を出す」

ボタンクリックで効果音を出します。この方法はロリポップ(OSバージョン5)以降で使えます。

import android.media.AudioAttributes;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

int mySoundID; //サウンド管理ID
int oto; //サウンド
SoundPool soundPool; //サウンドプール

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

//Buttonのインスタンス(button)にボタンを登録
Button button = (Button)findViewById(R.id.button);

//ボタンにクリックイベントを設定
button.setOnClickListener(this);

//サウンドプールをクリア
soundPool = null;

//音を出すための手続き1 ※音の出し方を設定している
AudioAttributes audioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build();

//音を出すための手続き2 ※1の設定を利用してsoundPoolを設定
soundPool = new SoundPool.Builder().setAudioAttributes(audioAttributes).setMaxStreams(1).build();

//鳴らしたい音を設定(rawフォルダにあるsound1という音)
oto = getResources().getIdentifier("sound1", "raw", getPackageName());

//あらかじめ音をロードする必要がある ※直前にロードしても間に合わないので早めに
mySoundID = soundPool.load(getBaseContext(), oto, 1);
}

//ボタンがクリックされると呼び出される
@Override
public void onClick(View v) {
//音を鳴らす
soundPool.play(mySoundID, 1f, 1f, 0, 0, 1);
}
}

 

ロリポップより前の端末に対応する場合は音を読み込むコードをバージョンで振り分けると良いです。

import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

int mySoundID; //サウンド管理ID
int oto; //サウンド
SoundPool soundPool; //サウンドプール

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

//Buttonのインスタンス(button)にボタンを登録
Button button = (Button)findViewById(R.id.button);

//ボタンにクリックイベントを設定
button.setOnClickListener(this);

//サウンドプールを一旦クリア
soundPool = null;

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

//ロリポップより前のバージョンに対応するコード
soundPool = new SoundPool(1, AudioManager.STREAM_ALARM, 0);
mySoundID = soundPool.load(getBaseContext(), oto, 1);

} else {

//音を出すための手続き1 ※音の出し方を設定している
AudioAttributes audioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build();
//音を出すための手続き2 ※1の設定を利用してsoundPoolを設定
soundPool = new SoundPool.Builder().setAudioAttributes(audioAttributes).setMaxStreams(1).build();
//鳴らしたい音を設定(rawフォルダにあるsound1という音)
oto = getResources().getIdentifier("sound1", "raw", getPackageName());
//あらかじめ音をロードする必要がある ※直前にロードしても間に合わないので早めに
mySoundID = soundPool.load(getBaseContext(), oto, 1);
}
}

//ボタンがクリックされると呼び出される
@Override
public void onClick(View v) {
//音を鳴らす
soundPool.play(mySoundID, 1f, 1f, 0, 0, 1);
}
}

 

END

 

「Androidoプログラミング」 Contextの取得方法

Contextが必要なときは以下の3つを試してみてください。

getContext();
getBaseContext();
getActivity().getBaseContext();

この3つを試してもContextを取得できない時(入力時のヒントが出ない)は、取得しようとしている場所が悪いので別のところで取得するようにしましょう。

END