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);
}

これは私のテストデバイス(私は1つしか持っていません.... HTC Evo)と2.2と2.3を実行しているエミュレーターで動作しています。

ユーザーが報告しているように、これによりNexusSが強制終了されることは事実です。このコードで問題が発生する他のデバイスのモデル名がわかりません。何か案は?開発者コンソールからのスタックトレースはこれを示しています:

java.lang.RuntimeException:アクティビティComponentInfo {android / com.android.internal.app.RingtonePickerActivity}を開始できません:android.appのandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)のjava.lang.NullPointerException。 ActivityThread.handleLaunchActivity(ActivityThread.java:2679)at android.app.ActivityThread.access $ 2300(ActivityThread.java:125)at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)atandroid.os.Handler。 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メソッド)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 。main(ZygoteInit.java:616)at dalvik.system.NativeStart.main(Native Method)原因:com.android.internal.app.RingtonePickerActivity.onPrepareListView(RingtonePickerActivity.java:214)のjava.lang.NullPointerException。 android.internal.app.AlertController $ AlertParams.createListView(AlertController.java:905)at com.android.internal.app.AlertController $ AlertParams.apply(AlertController.java:824)atcom.android.internal.app.AlertActivity。 setupAlert(AlertActivity.java:73)at com.android.internal.app.RingtonePickerActivity.onCreate(RingtonePickerActivity.java:188)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627)...11詳細lang.NullPointerException at com.android.internal.app.RingtonePickerActivity.onPrepareListView(RingtonePickerActivity.java:214)at com.android.internal.app.AlertController $ AlertParams.createListView(AlertController.java:905)atcom.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)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)...11詳細lang.NullPointerException at com.android.internal.app.RingtonePickerActivity.onPrepareListView(RingtonePickerActivity.java:214)at com.android.internal.app.AlertController $ AlertParams.createListView(AlertController.java:905)atcom.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)at 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)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627).. ..さらに11createListView(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)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627).. ..さらに111047)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上のスレッドは1つしか見つかりませんでしたが、回答が得られる前にスレッドアクティビティが停止したようです。他の誰もこれを経験したことがありませんか、それとも私はこれを間違った方法でやっていますか?

4

1 に答える 1

0

何らかの理由で着信音ピッカーが存在しないことがあります。null ポインターを取得しました。それを try キャッシュにラップし、着信音ピッカーが存在しないというダイアログを表示します。

于 2011-08-07T22:32:53.480 に答える