前提・実現したいこと
ArrayList<String> soundSource変数にファイルのUriを格納
ArrayList<String> soundList変数にファイルのタイトル文字列を格納
SoundList変数を、ダイアログ内でリスト表示します。
選択された項目がクリックされると、選ばれたSoundListのindex番号と同じsoundSouce変数に相当するUriを文字列で取り出したいです。
単純なミスかもしれないのですが、ここ2日ハマっておりまして、助けていただけるとありがたいです。
発生している問題・エラーメッセージ
java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.net.Uri.getCanonicalUri()' on a null object reference at android.media.Ringtone.play(Ringtone.java:333) at com.mooz.alarmclock02.SetAlarm$6.onClick(SetAlarm.java:229) at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1119) at android.widget.AdapterView.performItemClick(AdapterView.java:310) at android.widget.AbsListView.performItemClick(AbsListView.java:1155) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3120) at android.widget.AbsListView$3.run(AbsListView.java:4035) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
該当のソースコード
java
1 2public class SetAlarm extends Activity{ 3//Sound list 4ArrayList<String> soundList; 5ArrayList<String> soundSource; 6final Ringtone[] mRingtone = new Ringtone[1]; 7 8@Override 9public void onCreate(.....//中略 10 11 12 //Touch the sound name 13 txtSound.setOnClickListener(new View.OnClickListener() { 14 @Override 15 public void onClick(View v) { 16 choiceSound(mActivity, mContext); 17 } 18 }); 19 20 /** 21 * Choice the alarm sound. 22 * @param activity 23 * @param context 24 */ 25 private void choiceSound(Activity activity, final Context context){ 26 final RingtoneManager ringtoneManager = new RingtoneManager(context); 27 28 //Get a sound uri and sound title 29 getSoundTitle(context); 30 getSoundUri(context); 31 32 //Set up alert dialog 33 AlertDialog.Builder builder = new AlertDialog.Builder(activity); 34 //Set title to dialog window 35 builder.setTitle("Select the sound"); 36 //Initializing a new array adapter instance 37 ArrayAdapter arrayAdapter = new ArrayAdapter<String>( 38 mContext, 39 R.layout.snooze_time_list, // Recycled layout 40 soundList ); //List 41 42 //Select a alarm sound from sound name list. 43 builder.setSingleChoiceItems(arrayAdapter, -1, 44 new DialogInterface.OnClickListener() { 45 @Override 46 public void onClick(DialogInterface dialog, int which) { 47 // Sound a music when click a list item 48 mRingtone[0] = ringtoneManager.getRingtone(which); 49 mRingtone[0].play(); 50 mSoundUri = soundSource.get(which); 51 } 52 }); 53 54 //When you pushed a OK button 55 builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 56 @Override 57 public void onClick(DialogInterface dialog, int which) { 58 String soundName = mRingtone[0].getTitle(mContext); 59 txtSound.setText(soundName); 60 dialog.dismiss(); 61 mRingtone[0].stop(); 62 } 63 }); 64 65 //When you pushed a Cancel button 66 builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 67 @Override 68 public void onCancel(DialogInterface dialog) { 69 mRingtone[0].stop(); 70 } 71 }); 72 73 // Create a dialog 74 AlertDialog dialog = builder.create(); 75 dialog.show(); 76 } 77 78 /** 79 * Get a sound title 80 * @param context 81 */ 82 private void getSoundTitle(Context context){ 83 final RingtoneManager ringtoneManager = new RingtoneManager(context); 84 Cursor cursor = ringtoneManager.getCursor(); 85 soundList = new ArrayList<>(); 86 //Get a sound title 87 while(cursor.moveToNext()){ 88 //Log.d("Alarm Clock 02 : ", "Ringtone is " + cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)); 89 soundList.add(cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)); 90 } 91 92 cursor.close(); 93 } 94 95 /** 96 * Get a sound uri 97 * @param context 98 */ 99 private void getSoundUri(Context context){ 100 final RingtoneManager ringtoneManager = new RingtoneManager(context); 101 Cursor cursor = ringtoneManager.getCursor(); 102 soundSource = new ArrayList<>(); 103 String uriPrefix; 104 String uriIndex; 105 106 while(cursor.moveToNext()){ 107 //Log.d("Alarm Clock 02 : ", "Ringtone is " + cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)); 108 uriPrefix = cursor.getString(RingtoneManager.URI_COLUMN_INDEX); 109 uriIndex = cursor.getString(RingtoneManager.ID_COLUMN_INDEX); 110 soundSource.add(uriPrefix + uriIndex); 111 } 112 cursor.close(); 113 }
試したこと
choiceSound関数内にあるbuilder.setSingleChoiceItemsにて、mSoundUri = soundSource.get(which);のところで該当のエラーがでます。
builder.setSingleChoiceItemsの外でsoundSource.get(数字)を行うと、soundSource変数の文字列を取得できるのですが、上記のbuilder.setSingleChoiceItems内で行うと、エラーが出てしまうのです。
回答2件
あなたの回答
tips
プレビュー