Проблемы с настройкой мелодии звонка по умолчанию в коде

Возможный дубликат:
Как очистить Mediastore перед установка рингтона

В моем приложении для Android есть набор из примерно 130 mp3 разных звуковых клипов. Они перечислены в списке, и когда пользователь долго нажимает на один из них, он дает ему возможность установить его в качестве мелодии звонка или уведомления по умолчанию. По большей части у меня это работает для рингтона, но это немного непоследовательно.

Например, он может установить мелодию звонка по умолчанию в первый раз, но в следующий раз, когда я попытаюсь установить другой клип в качестве мелодии звонка по умолчанию, а затем зайду в свои списки мелодий, будет выбрано «Без звука». Кроме того, я заметил, что во время моего тестирования приложение создало 3-4 варианта в моем списке мелодий, у которых нет соответствующего файла, и я понятия не имею, как их удалить.

Я не очень опытный разработчик Android, поэтому я не могу понять, что я здесь делаю неправильно. Вот код для моего setRingtone() с переданным ресурсом:

public void playSound(int input){
    byte[] buffer=null;
    InputStream fIn = getBaseContext().getResources().openRawResource(input);
    int size=0;

    try {
        size = fIn.available();
        buffer = new byte[size];
        fIn.read(buffer);
        fIn.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }

    String path="/sdcard/sounds/";
    String filename="my_ringtone"+".mp3";

    boolean exists = (new File(path)).exists();
    if (!exists){new File(path).mkdirs();}

    FileOutputStream save;
    try {
        save = new FileOutputStream(path+filename);
        save.write(buffer);
        save.flush();
        save.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename)));

    File k = new File(path, filename);

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, "MyRingtone");
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
    values.put(MediaStore.Audio.Media.IS_ALARM, false);
    values.put(MediaStore.Audio.Media.IS_MUSIC, false);

    //Insert it into the database
    Uri newUri= this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);
    RingtoneManager.setActualDefaultRingtoneUri(
    this,
    RingtoneManager.TYPE_RINGTONE,
    newUri
    );
}

person fog    schedule 19.02.2012    source источник
comment
Следующий вопрос о Stack Overflow решил мою проблему: stackoverflow.com/questions/7302037/   -  person fog    schedule 27.02.2012


Ответы (1)


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

person stark    schedule 19.02.2012
comment
Это сработало, но я все еще получаю несколько списков в списке мелодий звонка каждый раз, когда устанавливаю новую мелодию звонка по умолчанию. Вышеприведенный код продолжает перезаписывать файл с тем же именем файла, которое я хочу, но когда я перехожу к выбору мелодии звонка Android, в моем каталоге raw/ (sound1, sound2, sound3 и т. .) вместо MyRingtone. Есть идеи, как это исправить? - person fog; 21.02.2012