我的应用程序中有以下代码,允许用户选择在我的应用程序通知用户时播放的特定铃声(我没有尝试更改设备上的默认铃声):
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:无法在 android.app 的 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 处启动活动 ComponentInfo{android/com.android.internal.app.RingtonePickerActivity}:java.lang.NullPointerException。 ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 在 android.os.Handler 的 android.app.ActivityThread.access$2300(ActivityThread.java:125) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)。 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 Method) 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 .dalvik.system.NativeStart.main(Native Method) 处的 main(ZygoteInit.java:616) 原因:com.android.internal.app.RingtonePickerActivity.onPrepareListView(RingtonePickerActivity.java:214) 处的 java.lang.NullPointerException。 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 更多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 更多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 更多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) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 在 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) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) ...还有 11 个1047) 在 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 上找到了一个与此问题有关的线程,而且似乎线程活动在得出答案之前就已经死了。没有其他人经历过这种情况,还是我只是以错误的方式做这件事?