Невозможно установить в качестве рингтона, так как файл уже существует

Я пытаюсь сделать приложение с функцией установки в качестве мелодии звонка, но у меня возникла проблема. Когда я устанавливаю в качестве рингтона, когда он работает. Но когда я пытаюсь установить в качестве рингтона во второй раз, ничего не происходит. Теперь проблема в том, что файл уже существует. Как я могу настроить свой код как... Если файл уже существует, перейдите к следующему шагу Вот мой код:

private File rsound;
private final File rpath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES);

private void s1ring() {
                Boolean success = false;
                rsound = new File(rpath, " Thesound.mp3");
                if (!rsound.exists()) {

                    try {
                        InputStream in = getResources().openRawResource(R.raw.s1a64);
                        FileOutputStream out = new 

FileOutputStream(rsound.getPath());
                        byte[] buff = new byte[1024];
                        int read = 0;

                        try {
                            while ((read = in.read(buff)) > 0) {
                                out.write(buff, 0, read);
                            }
                        } finally {
                            in.close();

                            out.close();
                        }
                    } catch (Exception e) {
                        success = false;

                    }
                } else {
                    success = true;

                }

                if (!success) { 
                   setRingtone();


                }
            }

            private void setRingtone() {
                ContentValues values = new ContentValues();
                   values.put(MediaStore.MediaColumns.DATA, rsound.getAbsolutePath());
                   values.put(MediaStore.MediaColumns.TITLE, "Thesound");
                   values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
                   values.put(MediaStore.Audio.Media.ARTIST, "The ringtones");
                   values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
                   values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
                   values.put(MediaStore.Audio.Media.IS_ALARM, true);
                   values.put(MediaStore.Audio.Media.IS_MUSIC, true);

                   Uri uri = MediaStore.Audio.Media.getContentUriForPath(rsound.getAbsolutePath());
                   getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + rsound.getAbsolutePath() + "\"",
                           null);
                   Uri newUri = getContentResolver().insert(uri, values);

                   RingtoneManager.setActualDefaultRingtoneUri(
                           S1.this, RingtoneManager.TYPE_RINGTONE,
                           newUri);
                   Toast.makeText(getApplicationContext(), "Ringtone set successfully",
                           Toast.LENGTH_SHORT).show();

            }


            }
        );

person Slim C.    schedule 08.03.2014    source источник
comment
ваше success логическое значение: что оно должно указывать? Успешное сохранение рингтона?   -  person donfuxx    schedule 08.03.2014
comment
Да, если файл создан на SD-карте. { success = true; } if (!success) { setRingtone();   -  person Slim C.    schedule 08.03.2014


Ответы (2)


настройте свой код следующим образом:

            if (!rsound.exists()) {
                //your create sound file code here.

            } else {
                //call set ringtone method also for the case file exists:
                setRingtone();
            }
person donfuxx    schedule 08.03.2014
comment
эм, как я могу это сделать? //добавляем мелодию звонка также для файла дела setRingtone(); есть метод - person Slim C.; 08.03.2014
comment
улучшил мой комментарий к коду, теперь он более понятен? @Sabroan в основном просто добавляет строку setRingtone(); в этот блок else - person donfuxx; 08.03.2014
comment
Ничего, нашел решение. Это было передо мной все время :D спасибо, чувак, ты мне очень помог - person Slim C.; 09.03.2014
comment
Превосходно! Рад это слышать :-) - person donfuxx; 09.03.2014

Звук устанавливается в качестве мелодии звонка только один раз, но решение этой проблемы таково: если вы попытаетесь снова запустить тот же код, вы будете вставлять повторяющуюся запись в таблицу MediaStore, но база данных SQLite не позволит вам это сделать. Вы должны либо переименовать свой файл и добавить еще один его экземпляр, либо войти, удалить запись, а затем повторить попытку. Поэтому я удалял эту запись каждый раз, а затем вставлял ее снова.

Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
Uri newUri = getContentResolver().insert(uri, values);

RingtoneManager.setActualDefaultRingtoneUri(activity.this,
        RingtoneManager.TYPE_RINGTONE, newUri);
person Zia Ur Rahman    schedule 29.09.2016