夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

Android番外編

こんばんは。

今日はAndroid番外編と表して、今開発を続けている災害ったーの次期バージョン(?)である災害ったーv2で今追加中の機能のご紹介です。


ちなみに災害ったーは現在ver.1.0.5が公開中なのでお願いします。



さて、まずは音楽の再生です。

音楽の再生にはMediaPlayerクラスを使用します。
まず、アプリのlayout/rawに音楽ファイルを保存します。ここではsample.mp3を使用しているとして話を勧めます。

importはコチラ
import android.media.MediaPlayer;
そして、onCreate内などで次のように記述します。
// 初期化はcreateメソッドで行う
MediaPlayer mp = MediaPlayer.create(this, R.raw.sample);
あと、雑多な処理のメソッドはコチラ
// ループするようにする
mp.setLooping(true);
// 再生
mp.start();
// 停止
mp.stop();
もちろん他にもメソッドはあります。ですが、ここでは割愛させていただきます。


さて、次はダイアログのカスタマイズ表示です。
通常AlertDialogはきまった形でしか提供できないのですが、次のようにすることでxmlファイルでレイアウトを設定することができます。

災害ったーv2ソースより抜粋(dialog.xmlに設定するとき)
View dV = this.getLayoutInflater().inflate(R.layout.dialog, null);
aAd = new AlertDialog.Builder(this).setView(dV).setTitle("アラーム鳴動中")
.setPositiveButton("はい", positiveListener).setNegativeButton("いいえ", negativeListener).create();
災害ったーv2ではこれをonCreate内に記述し、別の場所に以下を記述しています。
// はいボタンの設定
DialogInterface.OnClickListener positiveListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// ココに処理を記述
}
};
// いいえボタンの設定
DialogInterface.OnClickListener negativeListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
aAd.dismiss();
}
};
処理は割愛していますが、あとで災害ったーv2のメイン画面のコードを載せるので・・・


そして、三番目がGPSです。
僕は緯度、経度を求める目的のみで使っているので簡単なものですがまず次のように処理は記述します。
/* 現在地の取得 */
private LocationListener aLl = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
latitude = String.valueOf(location.getLatitude());
longitude = String.valueOf(location.getLongitude());
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
これによって処理を記述したらLocationManagerでコレを起動したり停止したりすることができます。ちなみにonLocationChangedメソッドはLocationListenerが起動している限り現在地が代わるたびに実行されます。

ちなみにLocationManagerは次のように使う
// 初期化
Location Manager aLm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// LocationListener(aLl)を起動する
aLm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, aLl);
// LocationListener(aLl)を停止する
aLm.removeUpdates(aLl);

あと、いい忘れていたのにOnLongClickListenerというのがありました。

Androidのタッチイベントは次のように実行されます。
OnTouch

OnLongClick

OnTouch

OnClick
まぁこれは実は長押ししたときの話で、長押しでなければOnLongClickが介入することはありません。

OnLongClickのリスナーはboolean型を返す数少ないリスナーの一つです。
ここでtrueを返さないと、OnClickまで処理が通ってしまい、長押しと単純なクリックを区別するのが難しくなります。


では、OnLongClickを実装する意味でも、そのほかの実際の実装方法を見てもらう意味でも有用だと思うので災害ったーのメイン画面のソースをさらして終りにします。

package jp.touyoubuntu.android.saigaitta;

import jp.co.nobot.libAdMaker.libAdMaker;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.provider.MediaStore.Audio.Media;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class SaigaittaActivity extends Activity {
private static final int REQUEST_CODE = 0;

private String latitude = "";
private String longitude = "";

private Button sTgBtn;
private Button sAlarmBtn;
private Button sInfoBtn;
private Button eInfoBtn;
private Button SettingBtn;

private MediaPlayer aMp;

private AlertDialog aAd;

private LocationManager aLm;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

/* テキスト生成の起動 */
sTgBtn = (Button) findViewById(R.id.tg_start);
sTgBtn.setOnClickListener(sTgListener);

/* アラーム */
sAlarmBtn = (Button) findViewById(R.id.alarm_start);
sAlarmBtn.setOnClickListener(sAlarmListener);
aMp = MediaPlayer.create(this, R.raw.alarm01); // アラーム音
// ダイアログ設定
View dV = this.getLayoutInflater().inflate(R.layout.dialog, null);
aAd = new AlertDialog.Builder(this).setView(dV).setTitle("アラーム鳴動中")
.setPositiveButton("はい", positiveListener).setNegativeButton("いいえ", negativeListener).create();
// アラームの終了処理
sAlarmBtn.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
aLm.removeUpdates(aLl);
aMp.stop();
return true;
}
});

/* GPS */
aLm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

/* 通知機能のON/OFF */
sInfoBtn = (Button) findViewById(R.id.info_start);
sInfoBtn.setOnClickListener(sInfoListener);
eInfoBtn = (Button) findViewById(R.id.info_stop);
eInfoBtn.setOnClickListener(eInfoListener);

/* 設定画面起動 */
SettingBtn = (Button) findViewById(R.id.setting_btn);
SettingBtn.setOnClickListener(SettingListener);

libAdMaker AdMaker = (libAdMaker)findViewById(R.id.admakerview);
AdMaker.setActivity(this);
AdMaker.siteId = "958";
AdMaker.zoneId = "2056";
AdMaker.setUrl("http://images.ad-maker.info/apps/ckp2l18at4bv.html");
AdMaker.start();
}

/* 現在地の取得 */
private LocationListener aLl = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
latitude = String.valueOf(location.getLatitude());
longitude = String.valueOf(location.getLongitude());
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};

/* 各種ボタン */
Button.OnClickListener sTgListener = new Button.OnClickListener() {
public void onClick(View v) {
// テキスト生成をスタートする
Intent it = new Intent();
it.setClass(SaigaittaActivity.this, TGActivity.class);
startActivityForResult(it, REQUEST_CODE);
}
};

Button.OnClickListener sAlarmListener = new Button.OnClickListener() {
public void onClick(View v) {
// アラームを起動。ダイアログから位置情報を送れる。
aMp.setLooping(true);
aMp.start();
aAd.show();
}
};
DialogInterface.OnClickListener positiveListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String gpsMessage = "私はアラームを鳴らしています。私はこの場所にいます。";
// GPSのリスナーを起動。aLlの処理が実行される。
aLm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, aLl);
String html = "http://maps.google.co.jp/?ie=UTF8&ll=" + latitude + "," + longitude
+ "&spn=0.1,0.1";
gpsMessage = gpsMessage + " " + html;
// インテントの発行
Intent it = new Intent();
it.setAction(Intent.ACTION_SEND);
it.setType("text/plain");
it.putExtra(Intent.EXTRA_TEXT, gpsMessage);
startActivity(Intent.createChooser(it, "どれで送信しますか?"));
}
};
// いいえボタンの設定
DialogInterface.OnClickListener negativeListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
aAd.dismiss();
}
};

Button.OnClickListener sInfoListener = new Button.OnClickListener() {
public void onClick(View v) {
// 通知機能をスタート
}
};

Button.OnClickListener eInfoListener = new Button.OnClickListener() {
public void onClick(View v) {
// 通知機能をストップ
}
};

Button.OnClickListener SettingListener = new Button.OnClickListener() {
public void onClick(View v) {
// 設定画面を起動
}
};

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) {
return;
}
}
}