У меня есть следующий код в моем приложении, чтобы позволить пользователю выбрать определенную мелодию звонка, которая будет воспроизводиться, когда мое приложение уведомляет пользователя (я не пытаюсь изменить звонок по умолчанию на устройстве ):
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);
}
Это работает на моем тестовом устройстве (у меня есть только один .... HTC Evo) и в моих эмуляторах, работающих под управлением 2.2 и 2.3.
Я точно знаю, что это приведет к принудительному закрытию Nexus S, как сообщили мои пользователи. Я не знаю названий моделей других устройств, с которыми этот код испытывает проблемы. Есть идеи? Трассировка стека из консоли разработчика показывает это:
java.lang.RuntimeException: невозможно запустить действие ComponentInfo {android / com.android.internal.app.RingtonePickerActivity}: java.lang.NullPointerException
на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2663)
на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679)
на android.app.ActivityThread.access $ 2300 (ActivityThread.java:125)
на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2033)
на android.os.Handler.dispatchMessage (Handler.java:99)
на android.os.Looper.loop (Looper.java:123)
на android.app.ActivityThread.main (ActivityThread.java:4627)
в java.lang.reflect.Method.invokeNative (родной метод)
в java.lang.reflect.Method.invoke (Method.java:521)
на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)
в dalvik.system.NativeStart.main (собственный метод)
Вызывается: java.lang.NullPointerException
в com.android.internal.app.RingtonePickerActivity.onPrepareListView (RingtonePickerActivity.java:214)
в com.android.internal.app.AlertController $ AlertParams.createListView (AlertController.java:905)
в com.android.internal.app.AlertController $ AlertParams.apply (AlertController.java:824)
в com.android.internal.app.AlertActivity.setupAlert (AlertActivity.java:73)
в com.android.internal.app.RingtonePickerActivity.onCreate (RingtonePickerActivity.java:188)
на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)
на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627)
... еще 11
В частности, вы можете увидеть исключение nullPointerException в RingtonePickerActivity.java:214. После проверки RingtonePickerActivity.java в grepcode и просмотра класса, в строке 214 видно, что класс ищет целое число addDefaultRintoneItem .
Я не знаю, чтобы кто-нибудь с Nexus S мог это проверить, но я думал, что удаление строки
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true
из моего кода может исправить nullPointer.
Может ли кто-нибудь подтвердить мою теорию? Никто другой не сталкивался с этой проблемой? Я нашел только один поток на SO, относящийся к этой проблеме, и кажется, что активность потока прекратилась до того, как был получен ответ. Никто не испытал этого или я просто поступаю неправильно?