2017年2月27日月曜日

Android AsyncTask 使い方

目次へ



Viewの描画に関する処理は、UIスレッド(メインスレッド)で行う必要があります。
別のスレッドで何かを実行し、その途中、あるいは、別のスレッドでの処理が終わってから、UIスレッドで描画を行いたい場合には、AsyncTaskが便利です。

AsyncTaskの使い方は、Swingの、SwingWorkerの使い方と似ています。

また、Androidには、UIスレッド以外のスレッドから描画ができる特別なSurfaceViewというViewもあります。

■■■■サンプル■■■■

下のサンプルは、Activityが作成されると、onCreateメソッドの中でAsyncTaskを継承したクラスのインスタンスを作成し、スタートさせています。

AsyncTaskには、次のようなメソッドがあるので、オーバーライドして使います。
  • doInBackground⑤
    UIスレッドとは、別のスレッドで実行されるのでViewの描画などはできません
  • onPostExecute⑦
    doInBackgroundが終わると、UIスレッドで実行されるので、Viewの描画などが行えます
  • onProgressUpdate⑧
    doInBackgrounからpublishProgressを呼び出す⑥と実行され、UIスレッドで実行されます


また、④を見ると、ジェネリックで次のように型が3つ指定されています。
AsyncTask<Object, String, Integer>
この3つの型を①、②、③とすると、各メソッドの引数に対応します。
  • ① doInBackgroundの引数。

    ⑤のように、引数に...を書くのは、可変個引数の意味で、ここでは、引数があってもなくてもいいという意味で使っています。
    このクラスのインスタンスを作りexecuteメソッドを呼び出すとdoInBackgroundが呼び出されるため、execute呼び出し時にdoInBackgroundに渡したいものを渡しますが、 この例では、doInBackgroundに何も渡すものがないので、execute()として呼び出しています。

  • ② onProgressUpdateの引数。

    ⑥でpublishProgressを呼び出すと、onProgressUpdateが呼び出されるため⑥の引数が②の型となります。
    また、publishProgressが呼び出されるたびに、すぐにonProgressUpdateが呼び出されるとは限らず、複数回のpublishProgress呼び出しに対して、onProgressUpdateが1回にまとめられることがあるため、複数回の引数が可変個引数として、受け取れるようになっています。
    例では String... values となっています。

  • ③ onPostExecuteの引数

    doInBackgroundが終了すると、その戻り値を引数としてonPostExecuteが呼び出されますので、doInBackgroundの戻り値もこの型となります。

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 次の2行で別スレッドでの実行が始まる
        B b = new B();
        b.execute(); //①の型の引数を渡すが可変個引数なので無でもOK
    }
              //①     ②   ③
    class B extends AsyncTask<Object, String, Integer> { //④
                       
                   //①
        protected Void doInBackground(Object... params) { //⑤
            for(int i=0; i<10; i++) {
                publishProgress("i=" + i);  //⑥
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
         //③
            return new Integer(13);
        }

                  //③        
        protected void onPostExecute(Integer i) {  //⑦
            Toast.makeText(MainActivity.this,i+"で終わった",
               Toast.LENGTH_SHORT).show();

        }
                    //②
        protected void onProgressUpdate(String... values) {//⑧
            for(String v:values) {
                Toast.makeText(MainActivity.this, v, 
               Toast.LENGTH_SHORT).show();
            }
        }
    }
}



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2017年1月14日土曜日

Android の GridLayout概要

目次へ



GridLayoutでは、列数、行数を指定しておき、その中に部品を置くと左上から順にWidgetが配置されていきます。 swingのGridLayoutと似た使い方です。
また、行と列を指定して、Widgetを好きな位置に配置することもできます。

■■■■GridLayout例(順番に配置)

レイアウトファイル
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnCount="3"        列数
    android:rowCount="3"          行数
    android:layout_gravity="center_horizontal">中央揃え
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"
        android:onClick="click" このボタンをクリックしたときのメソッド名
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2"
        android:onClick="click"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="3"
        android:onClick="click"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="4"
        android:onClick="click"

    以下同様に9のボタンまで作成します。

</GridLayout>


ボタンをクリックしたときのメソッド名をclickとしたので、Activityのクラスの中に
public void click(View v) {・・・}を作成します。
public class GridLayoutTest extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.third);
    }

    public void click(View v) {
        Button b = (Button)v;
        String s = b.getText()+"がクリックされました";
        Toast toast = Toast.makeText(this, s, Toast.LENGTH_SHORT);
        toast.show();
    }
}


上のような指定をした場合、次のような画面が表示されます。


■■■■GridLayout例(行と列を指定して配置)

レイアウトファイル
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnCount="2"
    android:rowCount="3" >
         <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1" /> 行と列を指定していないので先頭

         <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="1"
            android:layout_column="0"
            android:text="2" />

         <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="3" />

         <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="2"
            android:layout_column="1"
            android:text="4" />
</GridLayout>


上のような指定をした場合、次のような画面が表示されます。



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

Android の FrameLayout概要

目次へ



FrameLayoutでは、その中に部品を置くとその上に重なって表示されていきます。下の例は、それを使って画像の上にボタンともうひとつのが像を重ねています。

■■■■FrameLayout例

レイアウトファイル
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/img1"/ />
    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:src="@mipmap/ic_launcher" />
  <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="ボタン"/>


</FrameLayout>


上のような指定をした場合、次のような画面が表示されます。


にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2017年1月11日水曜日

Android ダイアログの使い方

目次へ



Androidでダイアログを作成する方法をまとめておきます。
ここで使うダイアログはすべてAlertDialogクラスを使い次のようなものを表示します。

  • メッセージを表示するだけのダイアログ
  • ボタンがあり、ユーザがボタンをタップし答えることのできるダイアログ
  • 複数の項目から選択をするダイアログ
  • ラジオボタンとボタンを表示するするダイアログ
  • チェックボックスとボタンを表示するするダイアログ




■■■■ダイアログを表示するためのボタンを作っておく



最初に5種類のダイアログを表示するためのボタンを作り、btn1~btn5の名前で使えるようにしておきます。
ボタンの作り方はこちら、あるいは、こちらなどで検索してください。

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

        Button btn1 = (Button)this.findViewById(R.id.button1);
        Button btn2 = (Button)this.findViewById(R.id.button2);
        Button btn3 = (Button)this.findViewById(R.id.button3);
        Button btn4 = (Button)this.findViewById(R.id.button4);
        Button btn5 = (Button)this.findViewById(R.id.button5);
    この下に、次から示すボタンのリスナを書く




■■■■メッセージを表示するだけのダイアログ



btn1をタップされた時の処理としてメッセージを表示するだけのダイアログを出すのが下のコードです。
この中の①のMainActivity.thisはActivityのインスタンスです。
OnClickListenerの中で使っているために、thisではなく、自分のクラス名.thisとしています。

if (btn1 != null) {
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);①
            builder.setTitle("タイトル");
            builder.setMessage("AlertDialogです");
            builder.show();
        }
    });
}



■■■■ボタンで答えるダイアログ



btn2をタップされた時の処理として上のようなダイアログを出すのが下のコードです。

ダイアログの中のボタンは、必要なものだけ、作成すればよいので、OKだけならbuilder.setPositiveButtonメソッドだけを呼び出せばよいことになります。

if (btn2 != null) {
    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("タイトル");
            builder.setMessage("ボタンのあるAlertDialogです");
            //3つのボタンのうち必要なボタンだけ作成すればよい
            builder.setPositiveButton("はい", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast = Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setNegativeButton("いいえ", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast = Toast.makeText(MainActivity.this, "NO", Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setNeutralButton("またね", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast=Toast.makeText(MainActivity.this,"またね",Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}




■■■■複数の項目から選択をするダイアログ



btn3をタップされた時の処理として上のような複数の項目から選択をするダイアログを出すのが下のコードです。

このとき、選択肢の文字列はフィールドで定義しておきます。

   String[] ss = {"選択1", "選択2", "選択3"};
    int selectedItem = 0;
    boolean[] selectedItems = {false, false, false};

if (btn3 != null) {
    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("選択してください");
            builder.setItems((CharSequence[]) ss, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int k) {
                    Toast toast=Toast.makeText(MainActivity.this,ss[k],Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}




■■■■ラジオボタンとボタンを表示するするダイアログ



btn4をタップされた時の処理として上のようなダイアログを出すのが下のコードです。
このとき、複数の項目から選択をするダイアログの時と同じようにフィールドで選択肢の文字列を定義しておきます。また、ラジオボタンを押したときにその番号を入れておくためのselectedItemもフィールドで定義しておきます。

   String[] ss = {"選択1", "選択2", "選択3"};
    int selectedItem = 0;


if (btn4 != null) {
    btn4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("選択してからOKボタンを押してください");
            builder.setSingleChoiceItems((CharSequence[]) ss, 0, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    selectedItem = which;
                    Toast toast = Toast.makeText(MainActivity.this, ss[which], Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast = Toast.makeText(MainActivity.this, ss[selectedItem], Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}



■■■■チェックボックスとボタンを表示するするダイアログ



btn5をタップされた時の処理として上のようなダイアログを出すのが下のコードです。
このとき、フィールドで選択肢の文字列と、どこにチェックが入っているかを示すbooleanの配列が必要です。
   String[] ss = {"選択1", "選択2", "選択3"};
   boolean[] selectedItems = {false, false, false};


    btn5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("選択してからOKボタンを押してください");
            builder.setMultiChoiceItems((CharSequence [])ss, selectedItems, 
                                 new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int k, boolean isChecked) {
                    selectedItems[which] = isChecked;
                    Toast toast = Toast.makeText(MainActivity.this, ss[k], Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String s = "選択されているのは";
                    for(int i=0; i<3; i++) {
                        if(selectedItems[i]) {
                            s += ss[i]+" ";
                        }
                    }
                    Toast toast = Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2017年1月8日日曜日

Android メニューの使い方

目次へ



基本的なことですが、Androidでメニューを作成し、メニューが選択された時の処理を作成する方法をまとめておきます。
  • onCreateOptionsMenu(Menu menu) がメニュー生成のためのメソッド
  • MenuInflater クラスがメニューを作成するためのクラス
  • onOptionsItemSelected(MenuItem item) がメニューが選択された時に呼ばれるメソッド


■■■■メニュー生成のためのメソッド

Android端末のメニューボタンを押すと画面にポップアップして現れるメニューをオプションメニューと言います。
オプションメニューは、ActivityクラスのonCreateOptionsMenuというメソッドをオーバーライドして作成します。
これは、AndroidStudioでBlank Activityなどを指定してプロジェクトを作成すると、MainActivityクラスに、作成されているものです。
Activityが作成され、オプションメニューを作成する段階になると、自動的にこのメソッドが実行され、メニューの組み込みが行われます。


■■■■MenuInflater

実際にメニュー項目を登録するには、MenuInflaterクラスを使います。
・Activityが持つgetMenuInflater()を使ってMenuInflaterオブジェクトの取得
MenuInflater menuInflater = getMenuInflater();
・メニューの生成
menuInflater.inflate(メニューのリソース,Menuのインスタンス);
・メニュー項目を追加するなら
Menuのインスタンス.add("aaa");


onCreateOptionsMenuメソッドの中で書くなら次のようになります。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    menu.add("aaa");
    return true;
}



res/menu/menu_main.xmlは以下のようになっています。
<menu 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"
    tools:context="com.example.yoko.myapplication.MainActivity">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"       ※
        android:title="@string/action_settings"
        app:showAsAction="never" />       ※
</menu>


これで、メニューボタンを押すと下のように表示されます。
※menu_main.xmlのandroid:orderInCategoryはメニューの並びに関する値で、設定された値に従って、表示されます。
この値が小さければ最小の方に、大きければ最後の方に並べられます。

※menu_main.xmlのapp:showAsActionはアクションバーでのメニューの表示に関するものです。
アクションバーは画面の幅が広い時には重要なメニューをボタンとして表示します。
app:showAsActionはボタンとして表示するかどうかを指定するもので以下のような値が設定できますが、上では、neverとして、ボタンとして表示しないようにしています。
never 表示しない
ifRoom 表示できるならする
withText テキストも一緒に表示する
always 常に表示する
collapseActionView ActionViewを表示するときに使う


もし、alwaysとすると、次のようにSettingsというボタンがメニューボタンの横に表示されます。



■■■■メニューが選択された時に呼ばれるメソッド

表示されたメニューをユーザが選ぶとonOptionsItemSelectedというメソッドが呼び出されます。
引数選択されたMenuItemのインスタンスが渡されますので、それによって必要な処理を書きます。
下の例では、aaaというMenuItemが選択された時にトーストを表示しています。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if("aaa".equals(item.getTitle())) {
        Toast toast = Toast.makeText(this,"aaaが選択されました",Toast.LENGTH_SHORT);
        toast.show();
    }
    return super.onOptionsItemSelected(item);
}



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2016年6月22日水曜日

JARファイルに画像を入れる

目次へ



画像をプロジェクト内に保存し、JARファイルにすると画像が表示されません。 いろいろ試して、うまくいったので忘れないように書いておきます。
  • リソースフォルダの作成
  • クラスローダからリソースを取得
  • ECLIPSEの実行構成の設定
  • JARファイルの作成


■■■■リソースフォルダの作成

プロジェクトのフォルダの下にimageというフォルダを作成し、その中に画像ファイルを入れます。 ECLIPSEのパッケージエクスプローラで見ると下のようになります。




■■■■クラスローダからリソースを取得

クラスローダを使って画像を取り入れているのが下のプログラムです。
public class ImageLabel01 extends JFrame {

 JLabel label = new JLabel();

 public ImageLabel01() {
  Image im=null;
  URL url=this.getClass().getClassLoader().
     getResource("image/stream.jpg");
  try {
   im=this.createImage((ImageProducer)url.getContent());
   label.setIcon(new ImageIcon(im));
  }catch(Exception ex){ }

  //ラベルをフレームに乗せフレームを表示
  getContentPane().add(label, BorderLayout.CENTER);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.setSize(350, 250);
  this.setVisible(true);
}
 public static void main(String[] args) {
  new ImageLabel01();
 }
}



■■■■ECLIPSEの実行構成の設定■■■■

メニューの[実行]から[実行構成]を選び、次のように設定をします。
[クラスパスのタブ]-[ユーザエントリをクリック]-[拡張ボタンを押す]
-[フォルダの追加にチェックを入れOK]
-[追加するフォルダとしてプロジェクトフォルダを選択しOK]
-[ユーザエントリにプロジェクト名-¥ が追加されていればOK(下の画像)]

これで、実行構成の設定が終わったのでこれで実行すればECLIPSE上で実行する分にはがぞうが表示されるはずです。

ユーザエントリにプロジェクト名-¥ が追加された様子



■■■■JARファイルの作成■■■■

あとは、次のように普通にJARファイルを作成すれば、JARファイルを実行したときにも画像が表示されるはずです。

[プロジェクトで右クリックしエクスポート]
-[Javaの中のJARファイルをクリックし次へボタン]
-[JARにしたいプロジェクトにチェックが入っていることを確認]
-[作成するJARファイルの出力先と名前を指定し次へボタン]
-[次の画面は何もせず次へ]
-[メインメソッドのあるクラスを指定し完了]


これでJARファイルができたらそれをダブルクリックすればちゃんと画像が出ます。


にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2016年4月4日月曜日

AndroidでMediaRecorder、MediaPlayerを使う

目次へ



声を録音したら、すぐにその声で返事をしてくれるアプリを作りたかったので、 まずは、録音と再生のしかたを、忘れないようにまとめておきます。
今後、これを変更して、「こんにちは」というと、ちょっと違う声で「こんにちは」と 同じ言葉をしゃべってくれるアプリをつくりたいのですが、まだ、いろいろわからないことだらけです。


■■■■音声の録音と再生■■■■

録音はMediaRecorder、再生はMediaPlayerを使います。
下のような画面が表示され、開始ボタンで録音開始、終了ボタンで録音終了、再生ボタンで今録音したものが再生されます。




import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private boolean isRecording = false;
    private TextView text;
    private MediaRecorder recorder;

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

 //textは説明を表示しているTextViewです
        text = (TextView) findViewById(R.id.text1);
    }
    //-------- 開始ボタンを押したときの処理
    public void onStart(View view) {
        if (isRecording) return;

        //-------- 保存先 「内部ストレージ\test.3gp」ができる
        String path = Environment.getExternalStorageDirectory() + "/test.3gp";

        //-------- Recorder作成
        recorder = new MediaRecorder();
        //-------- オーディオソースをマイクとする
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //-------- ファイルのフォーマットを3GPPとする
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        //-------- エンコーダをデフォルトとする
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        //-------- 出力先ファイル名指定
        recorder.setOutputFile(path);

        //-------- レコーディング
        try {
        //-------- 録音開始するには prepare,startを呼び出す
            recorder.prepare();
            recorder.start();
            isRecording = true;
            text.setText("isRecording");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //-------- 終了ボタンを押したときの処理
    public void onStop(View view) {
        if (!isRecording) {
            text.setText("録音中ではありません");
            return;
        }
        //-------- 終了には stop,reset,releaseを呼び出す
        recorder.stop();
        recorder.reset();
        recorder.release();
        isRecording = false;
        text.setText("録音終了");
    }
    //-------- 再生ボタンを押したときの処理
    public void onPlay(View view) {
        VoicePlayer player = new VoicePlayer();
        player.play();
    }
}





import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.widget.TextView;
import java.io.IOException;

public class VoicePlayer implements MediaPlayer.OnCompletionListener {
    private MediaPlayer player = new MediaPlayer();
    private String path;

    public VoicePlayer() {
        //-------- 再生が終わった時のリスナを設定
        player.setOnCompletionListener(this);
        //-------- 再生ボリューム 左、右を0.0f~1.0fで設定
        player.setVolume(1.0f, 1.0f);
        path = Environment.getExternalStorageDirectory() + "/test.3gp";
    }

    //-------- 再生
    public void play() {
        try {
            player.setDataSource(path);
            //-------- 再生するには、prepare、startを呼び出す
            player.prepare();
            player.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //-------- 再生が終わった時に呼び出される
    public void onCompletion(MediaPlayer mp) {
        //-------- 終了したら、stop、releaseを呼び出す
        player.stop();
        player.release();
    }
}




にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村