アプリに次のコードがあり、アプリがユーザーに通知したときに再生される特定の着信音をユーザーが選択できるようになっています(デバイスのデフォルトの着信音を変更しようとはしていません)。
public void ringtonePicker() {
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
this.startActivityForResult(intent, 999);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode != RESULT_OK) {
return;
}
if (requestCode == 999) {
Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (uri != null)
{
String ringTonePath = uri.toString();
SharedPreferences.Editor editor = mySharedPreferences.edit(); //opens shared preference editor
editor.putString("storedRingtoneLocation", ringTonePath);
editor.commit();
populateList(settingsList, settingsListDetails = getAndSetDetails(settingsList.length));
adapter.notifyDataSetChanged();
}
else
{
Toast.makeText(getApplicationContext(), "No Ringtone Path Found!", Toast.LENGTH_LONG).show();
}
}
else
{
Toast.makeText(getApplicationContext(), "Request Code is Bad", Toast.LENGTH_LONG).show();
}
super.onActivityResult(requestCode, resultCode, intent);
}
これは私のテストデバイス(私は1つしか持っていません.... HTC Evo)と2.2と2.3を実行しているエミュレーターで動作しています。
ユーザーが報告しているように、これによりNexusSが強制終了されることは事実です。このコードで問題が発生する他のデバイスのモデル名がわかりません。何か案は?開発者コンソールからのスタックトレースはこれを示しています:
java.lang.RuntimeException:アクティビティComponentInfo {android / com.android.internal.app.RingtonePickerActivity}を開始できません:android.appのandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)のjava.lang.NullPointerException。 ActivityThread.handleLaunchActivity(ActivityThread.java:2679)at android.app.ActivityThread.access $ 2300(ActivityThread.java:125)at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)atandroid.os.Handler。 dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:123)at android.app.ActivityThread.main(ActivityThread.java:4627)at java.lang.reflect.Method.invokeNative(Nativeメソッド)at java.lang.reflect.Method.invoke(Method.java:521)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)at com.android.internal.os.ZygoteInit 。main(ZygoteInit.java:616)at dalvik.system.NativeStart.main(Native Method)原因:com.android.internal.app.RingtonePickerActivity.onPrepareListView(RingtonePickerActivity.java:214)のjava.lang.NullPointerException。 android.internal.app.AlertController $ AlertParams.createListView(AlertController.java:905)at com.android.internal.app.AlertController $ AlertParams.apply(AlertController.java:824)atcom.android.internal.app.AlertActivity。 setupAlert(AlertActivity.java:73)at com.android.internal.app.RingtonePickerActivity.onCreate(RingtonePickerActivity.java:188)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627)...11詳細lang.NullPointerException at com.android.internal.app.RingtonePickerActivity.onPrepareListView(RingtonePickerActivity.java:214)at com.android.internal.app.AlertController $ AlertParams.createListView(AlertController.java:905)atcom.android.internal。 app.AlertController $ AlertParams.apply(AlertController.java:824)at com.android.internal.app.AlertActivity.setupAlert(AlertActivity.java:73)at com.android.internal.app.RingtonePickerActivity.onCreate(RingtonePickerActivity.java: 188)android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)...11詳細lang.NullPointerException at com.android.internal.app.RingtonePickerActivity.onPrepareListView(RingtonePickerActivity.java:214)at com.android.internal.app.AlertController $ AlertParams.createListView(AlertController.java:905)atcom.android.internal。 app.AlertController $ AlertParams.apply(AlertController.java:824)at com.android.internal.app.AlertActivity.setupAlert(AlertActivity.java:73)at com.android.internal.app.RingtonePickerActivity.onCreate(RingtonePickerActivity.java: 188)android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)...11詳細createListView(AlertController.java:905)at com.android.internal.app.AlertController $ AlertParams.apply(AlertController.java:824)at com.android.internal.app.AlertActivity.setupAlert(AlertActivity.java:73)at com .android.internal.app.RingtonePickerActivity.onCreate(RingtonePickerActivity.java:188)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627).. ..さらに11createListView(AlertController.java:905)at com.android.internal.app.AlertController $ AlertParams.apply(AlertController.java:824)at com.android.internal.app.AlertActivity.setupAlert(AlertActivity.java:73)at com .android.internal.app.RingtonePickerActivity.onCreate(RingtonePickerActivity.java:188)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627).. ..さらに111047)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)で...11詳細1047)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)で...11詳細
具体的には、RingtonePickerActivity.java:214でnullPointerExceptionを確認できます。grepcodeでRingtonePickerActivity.javaを調べてクラスを調べた後、214行目で、クラスが整数addDefaultRintoneItemを探していることがわかります。
Nexus Sを持っている人がこれをテストできるかどうかはわかりませんが
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true
、コードから行を削除するとnullPointerが修正される可能性があると考えていました。
誰かが私の理論を検証できますか?他の誰もこの問題を経験していませんか?この問題に関連するSO上のスレッドは1つしか見つかりませんでしたが、回答が得られる前にスレッドアクティビティが停止したようです。他の誰もこれを経験したことがありませんか、それとも私はこれを間違った方法でやっていますか?