アプリ開発・Linuxサーバ環境構築からSEOまで初心者向けのプログラミング技術を紹介しています。

サンプルコード

SQLiteの使い方(SQLiteOpenHelperクラス)~その2~

2012年2月2日(木) 11:06 AM

SQLiteの使い方(SQLiteOpenHelperクラス)~その1~で作ったサンプルに、SQLiteのレコードの更新機能と削除機能を追加してみました。

前回のサンプルと同じように、エディットテキストに入力して、「追加」ボタンを押すと、データがデータベースに追加されていきます。

SQLiteの使い方の画像1

「削除」ボタンを押すと、ID番号が一番大きいIDのデータが削除されます。

SQLiteの使い方の画像2

「更新」ボタンを押すと、ID番号が一番大きいIDのデータが「更新しました」に変わります。

SQLiteの使い方の画像3

「削除」ボタンを押すと、ID番号が一番大きいIDのデータが削除されます。

◆◆◆データベース(レコード)の更新◆◆◆
db.update(“testtb”, values, “_id = ?”, new String[] {“1”});

第一引数:テーブル名(String型)
第二引数:カラム値を格納したContentValues型の引数(ContentValues型)
第三引数、第四引数:SQLのWHERE条件文を作成するための引数。(String型、String [] 型)

第三引数、第四引数は、_id=1とかcomment=2などの簡単な条件文じゃないと、デバックが通りませんでした。max関数など複雑な条件文にするときはdb.execSQL(“”);を利用した方がいいかもしれないです。

◆◆◆データベース(レコード、テーブル)の削除◆◆◆
db.delete(“testtb”, “_id = ?”, new String[] {“1”});

第一引数:テーブル名(String型)
第二引数、第三引数:SQLのWHERE条件文を作成するための引数。(String型、String [] 型)

第二引数、第三引数を両方とも「null」にすると、すべてのレコードが削除されます

◆◆◆データベースの削除◆◆◆
File file = new File(“/data/data/com.sample.android.dbsamplea/databases/testdb”);
file.delete();

データベースそのものを削除するときは、file.delete();を使います。最初に、new File(“/data/data/(パッケージ名)/databases/(データベース名)“)でFileオブジェクトを生成し、その後delete();を使って削除します。
(File(“”)の引数は、データベースがあるパスです。Eclipseで、デバッグする場合は、DDMS画面で確認できます。)

↓↓↓修正または追加したファイルのコードは以下の通りです。↓↓↓
(それ以外は、SQLiteの使い方(SQLiteOpenHelperクラス)~その1~で作ったものと同じです。)

「DBSampleA.java」のサンプルコード

package com.sample.android.dbsamplea;

import java.io.File;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class DBSampleA extends Activity implements View.OnClickListener{

	private Button btn[] = new Button[3];
    private EditText edittext;
    private TextView textview;
    private MyDBHelper myhelper;
    private String str;
    private int num = 0;
    private static SQLiteDatabase db;

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

        //ボタンの生成
        btn[0] = (Button)findViewById(R.id.AddButton);
        btn[0].setOnClickListener(this);
        btn[1] = (Button)findViewById(R.id.UpdateButton);
        btn[1].setOnClickListener(this);
        btn[2] = (Button)findViewById(R.id.RemoveButton);
        btn[2].setOnClickListener(this);

        //エディットテキストの生成
        edittext = (EditText)findViewById(R.id.AddEditText);

        //テキストビューの生成
        textview = (TextView)findViewById(R.id.MyTextView);

        //データベースヘルパーの生成
        myhelper = new MyDBHelper(this);
        db = myhelper.getWritableDatabase();
        //db.delete("testtb", null, null);
        Cursor c = db.query("testtb", new String[] {"_id", "comment"}, null, null, null, null, null);
        startManagingCursor(c);
        str = "データベース一覧\n";
        while(c.moveToNext()) {
        	str += c.getString(c.getColumnIndex("_id")) + ":" +
        		c.getString(c.getColumnIndex("comment")) + "\n";
        	num++;
        }

       	textview.setText(str);
    }

    //ボタンクリックイベントの処理
    public void onClick(View v) {

    	ContentValues values = new ContentValues();

    	if(v == btn[0]) {
        	values.put("comment", edittext.getText().toString());
        	db.insert("testtb", null, values);
        	num++;
    	}
    	else if(v == btn[1]) {
    		String[] args = {String.valueOf(num)};
    		values.put("comment", "更新しました");
    		db.update("testtb", values, "_id = ?", args);
    	}
    	else if(v == btn[2]) {
    		String[] args = {String.valueOf(num)};
    		db.delete("testtb", "_id = ?", args);
    		num--;
    	}

        Cursor c = db.query("testtb", new String[] {"_id", "comment"}, null, null, null, null, null);
        startManagingCursor(c);
        str = "データベース一覧\n";
        while(c.moveToNext()) {
        	str += c.getString(c.getColumnIndex("_id")) + ":" +
        		c.getString(c.getColumnIndex("comment")) + "\n";

        }

       	textview.setText(str);

    }

    @Override
    public void onDestroy() {
    	super.onDestroy();
    	myhelper.close();

    	//データベース削除
    	File file = new File("/data/data/com.sample.android.dbsamplea/databases/testdb");
    	file.delete();
    }
}

「main.xml」のサンプルコード

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:id="@+id/AddEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/AddButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="追加"
/>
<Button
android:id="@+id/UpdateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新"
/>
<Button
android:id="@+id/RemoveButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="削除"
/>
</LinearLayout>

<TextView
android:id="@+id/MyTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

SQLiteの使い方(SQLiteOpenHelperクラス)~その1~

2012年2月1日(水) 2:45 PM

SQLiteのデータベースを作成し、エディットテキストから入力したデータを登録し、画面に表示するサンプルを作ってみました。

「データベース一覧」に、データベースに登録されているデータが表示されます。

データベース SQLiteの使い方の画像

「five」と入力して、追加ボタンを押すと、一覧に「5:five」と表示され、データベースにデータが追加されていきます。

データベース SQLiteの使い方の画像

◆◆◆SQLiteOpenHelperクラスを継承したクラスの実装◆◆◆

public class MyDBHelper extends SQLiteOpenHelper {

public MyDBHelper(Context context) {
//DBを作成
super(context, “testdb”, null , 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“CREATE TABLE testtb (_id INTEGER PRIMARY KEY, comment TEXT)”);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

「onCreate」は、データベースを作成した時に呼び出されるメソッドで、「onUpgrade」は、データベースをバージョンアップした時に呼び出されるメソッド。「onCreate」に、データベースのテーブルを作成するコードを書くことが多い

◆◆◆データベースの生成◆◆◆
public MyDBHelper(Context context) {
//ストレージ(ローカルファイル)にDBを作成
super(context, “testdb”, null , 1);
}

第一引数:コンテキスト
第二引数:データベースの名前(String型)
第三引数:とりあえず null にしておけば大丈夫だと思います。(CursorFactory型)
第四引数:データベースのバージョン番号(int型)

◆◆◆SQLの実行◆◆◆
db.execSQL(“CREATE TABLE testtb (_id INTEGER PRIMARY KEY, comment TEXT)”);

” “の中にSQL文を書いて実行することができる。テーブルを作成するだけでなく、レコードの追加(INSERT)、更新(UPDATE)、削除(DELETE)なども実行できる。ただし、検索(SELECT)は発行されないらしいので、db.queryを使う

◆◆◆データベース(レコード)の削除◆◆◆
db.delete(“testtb”, null, null);

第一引数:テーブル名
第二引数、第三引数:SQLのWHERE条件文を作成するための引数。

例えば
db.delete(“testtb”, “_id = ?”, new String[]{“1”});
を実行すると、_id=1のレコードが削除される。
(引数を二つに分けているのは、SQLインジェクション対策だと思われます。)

◆◆◆データベース(レコード)の検索◆◆◆
Cursor c = db.query(“testtb”, new String[] {“_id”, “comment”}, null, null, null, null, null);

第一引数:テーブル名
第二引数:取得するカラム名
第三引数、第四引数:条件文作成のための引数
第五引数:groupBy句の引数
第六引数:having句の引数
第七引数:orderBy句の引数
戻り値はCusor型のオブジェクト

◆◆◆カーソルの使い方◆◆◆
startManagingCursor(c);
while(c.moveToNext()) {
/*データがなくなるまで、ループ処理が繰り返される。
str += c.getString(c.getColumnIndex(“_id”)) + “:” +
c.getString(c.getColumnIndex(“comment”)) + “\n”;
}

startManagingCursor(Cursor c)は、カーソルを自動で管理してくれるメソッドで、このメソッドを呼び出した後、c.moveToNextを呼び出すと、カーソルが最初のデータに移動します。そのあとに、c.moveToNextを呼び出すとデータがなくなるまで、次のデータにカーソルが移動します
c.moveToFirstでも、最初のデータに移動することができますが、カーソルを使い終わった後に、c.closeをする必要があります。これをしないと、デバッグの際にSQLiteCursor.finalize()で強制終了してしまいます。startManagingCursor(Cursor c)は、カーソルのcloseを自動でしてくれるみたいなので、必要ありません。)

◆◆◆データベース(レコード)の追加◆◆◆
db.insert(“testtb”, null, values);

第一引数:テーブル名(String型)
第二引数:nullColumnHack。とりあえずnullで大丈夫だと思います。(String型)
第三引数:カラム値を格納したContentValues型の引数(ContentValues型)

◆◆◆ContentValuesに値を追加する。◆◆◆
ContentValues values = new ContentValues();
values.put(“comment”, edittext.getText().toString());

第一引数:キー値(カラム値)(String型)
第二引数:値(String型、integer型、Long型など)

↓↓↓修正または追加したファイルのコードは以下の通りです。↓↓↓
(それ以外は、新規プロジェクトを生成した時のものと同じです。)

「DBSampleA.java」のサンプルコード

package com.sample.android.dbsamplea;

import java.io.File;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class DBSampleA extends Activity implements View.OnClickListener{

	private Button btn;
    private EditText edittext;
    private TextView textview;
    private MyDBHelper myhelper;
    private String str;
    private static SQLiteDatabase db;

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

        //ボタンの生成
        btn = (Button)findViewById(R.id.AddButton);
        btn.setOnClickListener(this);

        //エディットテキストの生成
        edittext = (EditText)findViewById(R.id.AddEditText);

        //テキストビューの生成
        textview = (TextView)findViewById(R.id.MyTextView);

        //データベースヘルパーの生成
        myhelper = new MyDBHelper(this);
        db = myhelper.getWritableDatabase();

        //データベーステーブルクリア
        db.delete("testtb", null, null);

        //データベースのデータを読み取って表示する。
        Cursor c = db.query("testtb", new String[] {"_id", "comment"}, null, null, null, null, null);
        startManagingCursor(c);
        str = "データベース一覧\n";
        while(c.moveToNext()) {
        	str += c.getString(c.getColumnIndex("_id")) + ":" +
        		c.getString(c.getColumnIndex("comment")) + "\n";
        }

       	textview.setText(str);
    }

    //ボタンクリックイベントの処理
    public void onClick(View v) {

    	//データベースに、データを登録。
    	ContentValues values = new ContentValues();
    	values.put("comment", edittext.getText().toString());
    	db.insert("testtb", null, values);

    	//データベースのデータを読み取って表示する。
        Cursor c = db.query("testtb", new String[] {"_id", "comment"}, null, null, null, null, null);
        startManagingCursor(c);
        str = "データベース一覧\n";
        while(c.moveToNext()) {
        	str += c.getString(c.getColumnIndex("_id")) + ":" +
        		c.getString(c.getColumnIndex("comment")) + "\n";

        }

       	textview.setText(str);

    }

    @Override
    public void onDestroy() {
    	super.onDestroy();
    	myhelper.close();

    	//データベース削除
    	File file = new File("/data/data/com.sample.android.dbsamplea/databases/testdb");
    	file.delete();
    }
}

「MyDBHelper.java」のサンプルコード(追加ファイル)

package com.sample.android.dbsamplea;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHelper extends SQLiteOpenHelper {

	public MyDBHelper(Context context) {
		//DBを作成
		super(context, "testdb", null , 1);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE testtb (_id INTEGER PRIMARY KEY, comment TEXT)");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}
}

「main.xml」のサンプルコード

< ?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<edittext android:id="@+id/AddEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<button android:id="@+id/AddButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="追加"
/>
<textview android:id="@+id/MyTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</linearlayout>

onTouchEvent()メソッド(マルチタッチ)

2011年9月27日(火) 4:23 PM

マルチタッチを使って、タッチしたところに赤色と青色の丸を描画するサンプルを作ってみました。

MultiTouch1
MultiTouch2
MultiTouch3

画面をタッチすると、赤や青の丸が描画される。(イメージ)

タッチしたまま移動すると、丸もそれに合わせて移動する(イメージ)

画面から手を放すと丸が消えてしまう(イメージ)

マルチタッチを使うには、onTouchEvent()内の処理を以下のようにします。

public boolean onTouchEvent(MotionEvent event) {

int action = event.getAction();
int index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int eventID = event.getPointerId(index);
int touchCount = event.getPointerCount();

switch ( action & MotionEvent.ACTION_MASK ) {

case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
//画面がタッチされたときの動作
break;

case MotionEvent.ACTION_MOVE:
//タッチしたまま移動したときの動作
break;

case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
//タッチが離されたときの動作
break;
}

説明
int action = event.getAction();
アクション情報を取得する。

int index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
イベントID(PointerId)のためのインデックスを取得する.(マルチタッチでは、複数箇所タッチされた時のために、インデックスが割り当てられます。)

int eventID = event.getPointerId(index);
インデックスを引数にして、イベントID(PointerId)を取得する。(イベントIDによって、複数箇所タッチされていても、どのタッチ情報なのかを識別することができる。)

int touchCount = event.getPointerCount();
タッチ(インデックス)の数を取得する。

ACTION_POINTER_DOWN: タッチパネルの一箇所以上をタッチしている状態で、さらにタッチパネルを押した場合
ACTION_POINTER_UP: タッチパネルの二箇所以上をタッチしている状態で、うち一箇所を離した場合
ACTION_DOWN: タッチパネルがまだタッチされていない状態で、タッチパネルを押した場合
ACTION_MOVE: タッチパネルを押したままスライドさせた場合
ACTION_UP: タッチパネルがまだタッチされていない状態で、タッチパネルから指を持ち上げた場合

*マルチタッチはAndroid2.1(2.0)以降にしか対応していません。

◆ブログ記事「カスタムViewの実装の仕方」のサンプルに、マルチタッチ機能を加えてみました。

*変更点
①「CustomView.java」にマルチタッチ機能を実装。
onTouchEvent()内にinvalidate();を加えていないと、再描画されないみたいなので注意です。
②「SampleThree.java」に、View側からキーイベントを取得できるように、
view.setFocusable(true);
view.setFocusableInTouchMode(true);
を加えました。

「CustomView.java」のソースコード

package com.appliinfo.android.samplethree;

import java.util.HashMap;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class CustomView extends View
{
	private Context mContext;
	private Paint mCirclePaint1 = new Paint();
	private Paint mCirclePaint2 = new Paint();
    private HashMap points=new HashMap();
    public int redID = -1;
    public int blueID = -1;

	//コンストラクタ
	public CustomView(Context context) {
		super(context);
		mContext = context;
	}

	public CustomView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);

		Point circlePt;

		//ペイントの色とスタイルをセット(色:赤色 スタイル:図形の中を塗りつぶす)
		mCirclePaint1.setARGB(255, 255, 153, 153);
		mCirclePaint1.setStyle(Paint.Style.FILL);

		//ペイントの色とスタイルをセット(色:青色 スタイル:図形の中を塗りつぶす)
		mCirclePaint2.setARGB(255, 153, 204, 255);
		mCirclePaint2.setStyle(Paint.Style.FILL);

		canvas.drawColor(Color.WHITE);

		if(points.containsKey(redID)) {

			circlePt = points.get(redID);
			//画面の中心に円を描く
				canvas.drawCircle(circlePt.x, circlePt.y, 25, mCirclePaint1);
		}

		if(points.containsKey(blueID)) {

			circlePt = points.get(blueID);
			//画面の中心に円を描く
			canvas.drawCircle(circlePt.x, circlePt.y, 25, mCirclePaint2);
		}

	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {

	    int action = event.getAction();
	    int index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
	    int touchCount = event.getPointerCount();
	    int eventID = event.getPointerId(index);

		switch ( action & MotionEvent.ACTION_MASK ) {

		case MotionEvent.ACTION_DOWN:
		case MotionEvent.ACTION_POINTER_DOWN:
			//画面がタッチされたときの動作

			int tx =(int)event.getX(index);
			int ty =(int)event.getY(index);

			//タッチされた座標を取得
			Point posTouch = new Point(tx, ty);
				if(posTouch != null) {

					if(redID == -1) {
						redID = eventID;
					}
					else if(blueID == -1) {
						blueID = eventID;
					}
					//イベントIDとその座標を保存
					points.put(eventID, posTouch);
				}

			break;

		case MotionEvent.ACTION_MOVE:
			//タッチしたまま移動したときの動作

			for(index = 0; index < touchCount; index++) {

			    int eventID2 = event.getPointerId(index);
				int tx2 =(int)event.getX(index);
				int ty2 =(int)event.getY(index);

				//タッチされた座標を取得
				Point posTouch2 = new Point(tx2, ty2);

				if(points.containsKey(eventID2)) {

					if(posTouch2 != null) {
						//イベントIDとその座標を保存
						points.put(eventID2, posTouch2);
					}

				}
			}

			break;

		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_POINTER_UP:
			//タッチが離されたときの動作

			int tx3 =(int)event.getX(index);
			int ty3 =(int)event.getY(index);

			//タッチされた座標を取得
			Point posTouch3 = new Point(tx3, ty3);

			if(points.containsKey(eventID)) {

				if(eventID == redID) {
					redID = -1;
				}
				else if(eventID == blueID) {
					blueID = -1;
				}

				//イベントIDとその座標を消去
				points.remove(eventID);
			}

			break;
		}

		invalidate();

		return true;
	}

}

「SampleThree.java」のサンプルコード

package com.appliinfo.android.samplethree;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

public class SampleThree extends Activity {

    /** Called when the activity is first created. */

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

        LayoutInflater factory = LayoutInflater.from(this);

        // Set game layout
        View view = factory.inflate(R.layout.main, null);
        setContentView(view);

        // Enable view key events
		view.setFocusable(true);
		view.setFocusableInTouchMode(true);

    }
}

カスタムViewの実装の仕方

2011年9月26日(月) 3:43 PM

カスタムビューを使って、画面の真ん中に円を描くサンプルをつくってみました。

ボタンやテキストビューなど初めから用意されているViewだけでなく、自分自身でカスタムしたオリジナルViewを実装することができます。カスタムビューはゲームや複雑なアプリをつくるときに使われます。

Sample Image

◆実装の仕方◆
①Viewを継承したCustomViewクラスのための新しいファイル「CustomView.java」を作成する。

「CustomView.java」のソースコード

package com.appliinfo.android.samplethree;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class CustomView extends View
{
	private Context mContext;
	private Paint mCirclePaint = new Paint();

	//コンストラクタ
	public CustomView(Context context) {
		super(context);
		mContext = context;
	}

	public CustomView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);

		canvas.drawColor(Color.WHITE);

		//画面のサイズを取得
		int width = getWidth();
		int height = getHeight();

		//ペイントの色とスタイルをセット(色:青色 スタイル:図形の中を塗りつぶす)
		mCirclePaint.setARGB(255, 153, 204, 255);
		mCirclePaint.setStyle(Paint.Style.FILL);

		//画面の中心に円を描く
		canvas.drawCircle(width / 2, height / 2, 25, mCirclePaint);

	}

}

②res/layout/main.xmlにカスタムViewをセットする。

res/layout/main.xmlのソースコード

<?xml version=”1.0″ encoding=”utf-8″?>
<com.appliinfo.android.samplethree.CustomView xmlns:android=”http://schemas.android.com/apk/res/android
android:id=”@+id/customview”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:background=”#FF000000″>
</com.appliinfo.android.samplethree.CustomView>

LayoutInflaterを使ってmain.xmlからViewを生成し、setContentView()でセットする。

LayoutInflaterを使うと、動的にレイアウトxmlからViewを生成することができるので、プログラム実行中にレイアウトを切り替えることもできるそうです。

「SampleThree.java」のソースコード

package com.appliinfo.android.samplethree;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

public class SampleThree extends Activity {

    /** Called when the activity is first created. */

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

        LayoutInflater factory = LayoutInflater.from(this);

        // Set game layout
        View view = factory.inflate(R.layout.main, null);
        setContentView(view);

    }
}

残りの設定(AndroidManifest.xml)は、新しいプロジェクトをつくった時のままです。

MediaPlayerを使ったサウンドの再生

2011年6月19日(日) 4:08 PM

◆MediaPlayerの特徴:データをストリーム形式で読み込み、破棄する。BGMなどの大きいファイルを再生するときによく使われる。

良い点:メモリの負担が小さい
悪い点:呼び出しから再生までの時間がSoundPoolに比べて遅い

◆MediaPlayerを使って、サウンドを再生するには、以下のようにします。
*サウンド再生
private MediaPlayer mBgm;
this.mBgm = MediaPlayer.create(this, R.raw.bgm_title);
this.mBgm.setLooping(true);
this.mBgm.setVolume(1.0f, 1.0f);
mBgm.seekTo(0);
mBgm.start();

*サウンドの休止
mBgm.pause();

*サウンドの停止と破棄
mBgm.stop();
mBgm.release();

◆MediaPlayerクラスのメソッド
○MediaPlayer.create(Context context, int resid)
第一引数:コンテキスト 第二引数:リソースID

○setLooping(boolean looping)
第一引数:ループするかどうか(true:ループする false:ループしない)

○setVolume(float leftVolume, float rightVolume)
ボリューム設定(0.0~1.0の間で設定する)

○seekTo(int msec)
音楽の開始位置をミリ秒単位で指定する。

◆ブログ記事「SoundPoolを利用したサウンドの再生」のサンプルに、MediaPlayerを利用したサウンドの再生機能を加えてみました。

*変更点
①「res」→「raw」フォルダの中にbgm_title.midファイルを加えました。
②src/com.example.android.sample/Sample.javaの変更

package com.example.android.sampletwo;

import android.app.Activity;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class SampleTwo extends Activity {
 private TextView aTextView;
 private TextView bTextView;
 private char[] charactor = new char[4];
 private String moji;
 private int x, y;
 private SoundPool mSoundPool;
 private int SoundId;
 private MediaPlayer mBgm;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.main);

        aTextView = (TextView) findViewById(R.id.myTextView);
     bTextView = (TextView) findViewById(R.id.myTextPosition);

        //データの書き込み
     SharedPreferences pref = this.getSharedPreferences("MemoPrefs", MODE_PRIVATE);
     aTextView.setText(pref.getString("memo", ""));
     bTextView.setText("X:" + pref.getInt("xposition", 0) + " Y:" + pref.getInt("yposition", 0));

     //SoundPoolの生成と読み込み
     this.mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
     this.SoundId = mSoundPool.load(this, R.raw.sb_blast, 1);

     //MediaPlayerの生成と読み込み
     this.mBgm = MediaPlayer.create(this, R.raw.bgm_title);
     this.mBgm.setLooping(true);
     this.mBgm.setVolume(1.0f, 1.0f);

         mBgm.seekTo(0);
         mBgm.start();

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

     x = (int)event.getX();
     y = (int)event.getY();

     switch (event.getAction()) {

      case MotionEvent.ACTION_DOWN:
       charactor[0] = (char)(68); //D
       charactor[1] = (char)(79); //O
       charactor[2] = (char)(87); //W
       charactor[3] = (char)(78); //N
       moji = String.valueOf(charactor);
       aTextView.setText(moji);
       bTextView.setText("X:" + x + " Y:" + y);
       break;

      case MotionEvent.ACTION_UP:
       charactor[0] = (char)(85); //U
       charactor[1] = (char)(80); //P
       charactor[2] = (char)(32); //スペース
       charactor[3] = (char)(32); //スペース
       moji = String.valueOf(charactor);
       aTextView.setText(moji);
       bTextView.setText("X:" + x + " Y:" + y);
       mSoundPool.play(SoundId, 1.0f, 1.0f, 1, 0, 1.0f);
       break;

      case MotionEvent.ACTION_MOVE:
       charactor[0] = (char)(77); //M
       charactor[1] = (char)(79); //O
       charactor[2] = (char)(86); //V
       charactor[3] = (char)(69); //E
       moji = String.valueOf(charactor);
       aTextView.setText(moji);
       bTextView.setText("X:" + x + " Y:" + y);
       break;

      case MotionEvent.ACTION_CANCEL:
       aTextView.setText("ACTION_CANCEL");
       break;

       }

     return super.onTouchEvent(event);
     }

    protected void onResume() {
     super.onResume();

         mBgm.start();
    }

    protected void onRestart() {
     super.onRestart();

         mBgm.start();
    }

    protected void onPause() {
     super.onPause();

         mBgm.pause();
    }

    protected void onStop() {
     super.onStop();

     //データの保存
     SharedPreferences pref = this.getSharedPreferences("MemoPrefs", MODE_PRIVATE);
     SharedPreferences.Editor editor = pref.edit();
     editor.putString("memo", aTextView.getText().toString());
     editor.putInt("xposition", x);
     editor.putInt("yposition", y);
     editor.commit();

     mBgm.pause();
    }

    protected void onDestroy() {
     super.onDestroy();

         mBgm.stop();
         mBgm.release();
    }

}
  • 広告

* RSS FEED