Принудительно закрыть на RingtonePicker

Мой код отказался возвращать правильный код запроса, поэтому я немного импровизировал. Он всегда возвращал -1.

    if(v.getId() == R.id.imageButton9)
    {
        request = 888;
        Intent wpIntent = new Intent();
        wpIntent.setType("image/*");
        wpIntent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(wpIntent, "Select Picture"), SELECT_PICTURE);
    }

    else if(v.getId() == R.id.imageButton10)
    {
        String uri = null;
        request = 999;
        rtIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
        rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
        rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone");
        if( uri != null)
        {
            rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Uri.parse(uri));
        }
        else
        {
            rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri)null);
        }       
        this.startActivityForResult(rtIntent, SELECT_TONE);
    }

Я объявил две переменные в начале своего кода:

    protected static final int SELECT_PICTURE = 888;
protected static final int SELECT_TONE = 999;

Вот onActivityResult:

    public void onActivityResult(int resultCode, int requestCode, Intent data)
{
    Toast.makeText(this, "onActivityResult: "+requestCode, Toast.LENGTH_SHORT).show();

    if(request == 888)
    {
        Toast.makeText(this, "Picture Selection", Toast.LENGTH_SHORT).show();
        Uri selectedImage = Uri.parse(data.getDataString());
        wpPath = getPath(selectedImage);
        Toast.makeText(this, "WP Path: "+wpPath, Toast.LENGTH_SHORT).show();
        request = 0;
    }

    else if(request == 999)
    {
        Toast.makeText(this, "Tone Selection", Toast.LENGTH_SHORT).show();
        Log.i("RT Picked is: ", rtIntent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI).toString());
        Uri uri = rtIntent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        if (uri != null) 
        {
            rtPath = uri.toString();
            Toast.makeText(this, "Ringtone Path: "+rtPath, Toast.LENGTH_SHORT).show();
            request = 0;
        }
    }
}

Это всегда принудительно закрывает. Это дает следующую ошибку:

06-01 12:40:35.388: E/AndroidRuntime(7437): java.lang.RuntimeException: Ошибка доставки результата ResultInfo{who=null, request=999, result=-1, data=Intent {(имеет дополнительные функции)}} к действию {com.asim.autobot/com.asim.autobot.profile}: java.lang.NullPointerException

Я застрял. Не могу решить эту проблему.

Во-первых, почему requestCode всегда возвращает -1? Во-вторых, почему приложение принудительно закрывается на rtIntent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);?

РЕДАКТИРОВАТЬ: Полный Logcat http://i47.tinypic.com/1zm2gww.jpg

Строка, на которую он указывает, — это Log.i("RT Picked is: ", rtIntent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI).toString());


person Asim    schedule 01.06.2012    source источник
comment
Используйте переключатель регистра вместо проверки кнопки с помощью if (if(v.getId() == R.id.imageButton9))   -  person Aerrow    schedule 01.06.2012


Ответы (2)


Когда вы получаете код результата -1, он работает как RESULT_OK = -1

Проверяем следующую строку:

rtIntent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI).toString()

У вас есть параметр с именем Intent data, и вы должны работать с ним вместо вашей переменной rtIntent. Ваша переменная rtIntent не будет изменена, поэтому getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI), вероятно, вернет значение null.

person WarrenFaith    schedule 01.06.2012
comment
Я люблю тебя, чувак, совсем не по-гейски. Большое спасибо за помощь. Я отметил ваш ответ как принятый. Пожалуйста, проверьте этот вопрос еще раз, потому что мне может понадобиться небольшая помощь с установкой возвращенного Uri в качестве мелодии звонка. Хотел бы я связаться с вами за пределами stackoverflow за помощью:/ - person Asim; 01.06.2012
comment
Поиск тоже работает :) Попробуйте это решение: stackoverflow.com/questions/7671637/ - person WarrenFaith; 01.06.2012
comment
Я видел это... Смотрите, мой код был в порядке. Просто я использовал неправильное намерение, лол - person Asim; 02.06.2012

Попробуйте этот код,

    public void onClick(View v) {

        switch (v.getId()) {
        case R.id.imageButton9:
            request = 888;
            Intent wpIntent = new Intent();
            wpIntent.setType("image/*");
            wpIntent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(wpIntent, "Select Picture"), SELECT_PICTURE);
        case R.id.imageButton10:

            String uri = null;
            request = 999;
            rtIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
            rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
            rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone");
            if( uri != null)
                {
                    rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Uri.parse(uri));
                }
            else
                {
                    rtIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri)null);
                }       
                        this.startActivityForResult(rtIntent, SELECT_TONE);

            break;
        default:
            break;
        }

    }


       public void onActivityResult(int resultCode, int requestCode, Intent data)
{
    Toast.makeText(this, "onActivityResult: "+requestCode, Toast.LENGTH_SHORT).show();

    if(requestCode == SELECT_PICTURE)
    {
        Toast.makeText(this, "Picture Selection", Toast.LENGTH_SHORT).show();
        Uri selectedImage = Uri.parse(data.getDataString());
        wpPath = getPath(selectedImage);
        Toast.makeText(this, "WP Path: "+wpPath, Toast.LENGTH_SHORT).show();
        request = 0;
    }

    else if(requestCode == SELECT_TONE)
    {
        Toast.makeText(this, "Tone Selection", Toast.LENGTH_SHORT).show();
        Log.i("RT Picked is: ", rtIntent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI).toString());
        Uri uri = rtIntent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        if (uri != null) 
        {
            rtPath = uri.toString();
            Toast.makeText(this, "Ringtone Path: "+rtPath, Toast.LENGTH_SHORT).show();
            request = 0;
        }
    }
}
person Aerrow    schedule 01.06.2012
comment
Пытался. Не работает. Когда я нажимаю «Выбрать рингтон», результат активности возвращает -1 и, следовательно, ничего. Когда я нажимаю «Выбрать обои», сначала открывается RingtoneChooser (используется ли система Android или GoSMS). Когда я нажимаю назад, открывается WallpaperChooser (Галерея, Root Explorer и т. д.). - person Asim; 01.06.2012