Android アプリ開発「MATRIX」

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


リストビューに一覧表示したサウンドをタップ操作で再生させる方法

リストビューに一覧表示したサウンドをタップ操作で再生させる方法リスト表示したサウンドを再生させる

今回は、端末に内蔵されている着信音、通知音、アラーム音の名前を ListView に一覧で表示し、その一覧からタップされたサウンドが再生されるアプリを作ります。

必要なクラスやオブジェクトなどは以下です。

・RingtoneManager ・・・内蔵サウンドの管理
・Ringtone・・・サウンド操作(再生、ループ、停止など)
・Cursor・・・データの移動や参照など
・ListView・・・一覧表示を可能にするビュー
・ArrayList・・・リスト配列

サンプルコード① MainActivity.java

ポイントは、レイアウトファイルに配置した ListView に「OnClickListener」ではなく、「OnItemClickListener」を設定するところです。このリスナーを設定しないとリスト項目をタップしても反応しません。

また、アクティビティには ListView のクリックイベントを受け取るリスナー「OnItemClickListener」を実装(implements)しなければなりませんので、忘れないように注意してください。

それから、ListView に表示するサウンドの種類は「RingtoneManager.TYPE_ALL」の部分でフィルターができます。

・RingtoneManager.TYPE_ALL・・・すべて
・RingtoneManager.TYPE_ALARM・・・アラーム音
・RingtoneManager.TYPE_NOTIFICATION・・・通知音
・RingtoneManager.TYPE_RINGTONE・・・呼出音

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

//オブジェクトの準備
private RingtoneManager ringtoneManager; //リングトーンマネージャー
private Ringtone ringtone; //リングトーン

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

//ビューにレイアウトファイルをセット
setContentView(R.layout.activity_main);
//配列変数を準備
ArrayList food = new ArrayList<>();
//リングトーンマネージャーを取得
ringtoneManager = new RingtoneManager(getApplicationContext());
//アラーム・通知音・呼び出し音のすべてを対象にする
ringtoneManager.setType(RingtoneManager.TYPE_ALL);
//リングトーンマネージャーのカーソルを作成
Cursor cursor = ringtoneManager.getCursor();
//カーソルを移動しながら処理を繰り返す
while(cursor.moveToNext()) {
//配列foodにサウンド名を追加する
food.add(cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX));
}
//レイアウトファイルにあるリストビューを取得
ListView listView = (ListView)findViewById(R.id.listview);
//リストビューにデータを
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,food);
//リストビューに配列アダプターをセット(リスト完成)
listView.setAdapter(adapter);
//リストビューにアイテムクリックリスナーをセット
listView.setOnItemClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//リングトーンマネージャーからリングトーンを取得
ringtone = ringtoneManager.getRingtone(position);
//再生中の判定
if (ringtone.isPlaying()) {
//再生中なら停止
ringtone.stop();
}
//サウンドを再生
ringtone.play();
}
}

 

サンプルコード② activity_main.xml

レイアウトファイルには ListView だけを配置してあります。

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />

実行結果

サンプルコードを実行すると、端末に内蔵されているサウンドの一覧が表示され、項目をタップするとそのサウンドがループ無しで再生されます。「通知音」は数秒の短いものが多く、「アラーム音」や「着信音」には長めのサウンドが多く存在します。

ListView の使い方

備考・その他

内蔵サウンドには1秒くらいの短いサウンドから延々にループしてしまうサウンドまであるので、単純に再生しただけではバランスが悪くなってしまうので、短いサウンドは「15秒間ループさせる」、また、延々とループするサウンドは「15秒で停止する」という処理を加えた方がグッと良くなるでしょう。

END