我的应用程序中有以下代码,允许用户选择当我的应用程序通知用户时将播放的特定铃声(我没有尝试更改默认铃声装置):
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) at java.lang.reflect.Method.invokeNative(Native Method) 在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) at dalvik.system.NativeStart.main(Native Method) 引起: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个
具体来说,您可以在RingtonePickerActivity.java:214中看到nullPointerException。在grepcode检查RingtonePickerActivity.java并查看类之后,可以在第214行看到该类正在查找整数 addDefaultRintoneItem 。
我不知道任何有Nexus S的人都可以对此进行测试,但我在考虑删除这条线
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true
从我的代码可能会纠正nullPointer。
任何人都可以验证我的理论吗?没有其他人经历过这个问题吗?我只在SO上发现了一个关于这个问题的线程,似乎线程活动在得到答案之前就已经死了。没有其他人经历过这种情况,或者我只是做错了吗?
答案 0 :(得分:0)
无论出于何种原因,有时都不存在铃声选择器。您已经获得了一个空指针,只需将其包装在try缓存中并显示一个对话框,说明铃声选择器不存在。