3

我的应用程序中有以下代码,允许用户选择在我的应用程序通知用户时播放的特定铃声(我没有尝试更改设备上的默认铃声):

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 上找到了一个与此问题有关的线程,而且似乎线程活动在得出答案之前就已经死了。没有其他人经历过这种情况,还是我只是以错误的方式做这件事?

4

1 回答 1

0

无论出于何种原因,铃声选择器有时都不存在。你得到了一个空指针,只需将它包装在一个尝试缓存中并显示一个对话框,说明铃声选择器不存在。

于 2011-08-07T22:32:53.480 回答