質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

415閲覧

ArrayListで取得した文字列が、builder.setSingleChoiceItemsのなかで取り出せない

mooz999

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2018/11/27 15:22

編集2018/11/28 00:16

前提・実現したいこと

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内で行うと、エラーが出てしまうのです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2018/11/27 23:36

mRingtone の定義がないように見えるのですが、定義はどこにあるのでしょうか。
mooz999

2018/11/28 00:14 編集

閲覧頂きありがとうございます。クラス変数で定義しています。 public class SetAlarm extends Activity{ //Sound list ArrayList<String> soundList; ArrayList<String> soundSource; final Ringtone[] mRingtone = new Ringtone[1]; @Override public void onCreate(..... と定義しています。
guest

回答2

0

getSoundTitle(context);
とSoundListを取得する処理を関数化したのが原因?のようです。

関数で渡すことを解除し、choiceSound関数内で以下のように記述すると、mRingtone[0] = ringtoneManager.getRingtone(which);
とオブジェクトを取得した際に、mRingtone[0].mLocalPlayerがnullにならず、処理に成功しました。

Java

1private void choiceSound(Activity activity, final Context context){ 2 final RingtoneManager ringtoneManager = new RingtoneManager(context); 3 final Ringtone[] mRingtone = new Ringtone[1]; 4 //Get a sound uri and sound title 5 6 Cursor cursor = ringtoneManager.getCursor(); 7 soundList = new ArrayList<>(); 8 //Get a sound title 9 while(cursor.moveToNext()){ 10 //Log.d("Alarm Clock 02 : ", "Ringtone is " + cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)); 11 soundList.add(cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)); 12 } 13 //中略

投稿2018/11/30 15:39

mooz999

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

見た限り問題っぽさそうなのは

ringtoneManager.getRingtone(which)

の部分ですね。このあと、

Java

1if( mRingtone[ 0 ] == null ){ 2 System.out.println( "nullだよ" ); 3 return; 4}

こんな感じの処理を書いて、nullだよと出たら変数がNullだからでしょう。

後、エラーを見ると、2行目に

at android.media.Ringtone.play(Ringtone.java:333)

とあります。これは、この箇所でエラーが起きている、というものですので、
soundSource.get が問題ではないのだと思われます。

投稿2018/11/28 07:45

編集2018/11/29 23:17
yukkuri

総合スコア624

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mooz999

2018/11/29 15:21

返事が遅くなってしまって申し訳ありません。 ご察しの通り、mRingtone[0]のオブジェクト取得の時点でうまく情報を取得できず、次の処理の mRingtone[0].play()のところで落ちてしまってました。 原因を絞れてきたので、もう少し調査してみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問