Android Ringtone Picker Активность сбоя на некоторых устройствах .... особенно Nexus S - PullRequest
3 голосов
/ 06 августа 2011

У меня есть следующий код в моем приложении, чтобы позволить пользователю выбрать определенную мелодию звонка, которая будет воспроизводиться, когда мое приложение уведомляет пользователя (я не пытаюсь изменить звонок по умолчанию на устройстве ):

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) в java.lang.reflect.Method.invokeNative (родной метод) в 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) в dalvik.system.NativeStart.main (собственный метод) Вызывается: 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

В частности, вы можете увидеть исключение nullPointerException в RingtonePickerActivity.java:214. После проверки RingtonePickerActivity.java в grepcode и просмотра класса, в строке 214 видно, что класс ищет целое число addDefaultRintoneItem .

Я не знаю, чтобы кто-нибудь с Nexus S мог это проверить, но я думал, что удаление строки intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true из моего кода может исправить nullPointer.

Может ли кто-нибудь подтвердить мою теорию? Никто другой не сталкивался с этой проблемой? Я нашел только один поток на SO, относящийся к этой проблеме, и кажется, что активность потока прекратилась до того, как был получен ответ. Никто не испытал этого или я просто поступаю неправильно?

1 Ответ

0 голосов
/ 08 августа 2011

Средство выбора мелодии звонка иногда не существует по какой-либо причине.Вы получили нулевой указатель, просто поместите его в кэш попыток и покажите диалоговое окно, в котором говорится, что средство выбора мелодии звонка не существует.

...