Android铃声选择器活动在特定设备上崩溃....特别是Nexus S.

时间:2011-08-06 18:48:04

标签: android android-activity ringtone

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

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上发现了一个关于这个问题的线程,似乎线程活动在得到答案之前就已经死了。没有其他人经历过这种情况,或者我只是做错了吗?

1 个答案:

答案 0 :(得分:0)

无论出于何种原因,有时都不存在铃声选择器。您已经获得了一个空指针,只需将其包装在try缓存中并显示一个对话框,说明铃声选择器不存在。