Сохранение звука в качестве мелодии звонка

Я пытаюсь установить WAV-файл в качестве мелодии звонка на устройствах Android. Приведенный ниже код может создавать каталоги и звуковой файл, но, похоже, возникают проблемы при настройке файла в качестве мелодии звонка, не говоря уже о выбранной мелодии звонка. После завершения метода я перехожу на мелодии звонка на устройстве, и для выбранной мелодии по умолчанию устанавливается значение "Нет". Есть идеи, что здесь происходит? Я использую разрешение WRITE_EXTERNAL_STORAGE в моем манифесте. Кроме того, формат звукового фрагмента не имеет значения для меня, я не против преобразования всего, что нуждается в преобразовании.

Спасибо!!

private String saveAs(String fileName) {
    int resSound = getContext().getResources().getIdentifier(fileName, "raw", getContext().getPackageName());

    // Resolve save path and ensure we can read and write to it
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/media/audio/ringtones/";
    File dir = new File(path);
    fileName += ".wav";

    if (!dir.exists()) {
        dir.mkdirs();
    }

    if(!dir.canRead() || !dir.canWrite()) {
        return "Unable to save ringtone.";
    }

    // Load the audio into a buffer
    byte[] buffer;
    InputStream fIn = this.context.getBaseContext().getResources().openRawResource(resSound);
    int size;

    try {
        size = fIn.available();
        buffer = new byte[size];
        fIn.read(buffer);
        fIn.close();
    }
    catch (IOException e) {
        return "Error opening sound file";
    }


    File file = new File(dir, fileName);
    FileOutputStream save;
    try {
        save = new FileOutputStream(file);
        save.write(buffer);
        save.flush();
        save.close();
    }
    catch (FileNotFoundException e) {
        return "Error loading sound file.";
    }
    catch (IOException e) {
        return "Unable to save ringtone.";
    }

    // Register the sound byte with the OS and set its properties
    this.context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path + fileName)));

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, getSoundTitle(fileName));
    values.put(MediaStore.MediaColumns.SIZE, size);
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
    values.put(MediaStore.Audio.Media.ARTIST, "Sound Clip");
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
    values.put(MediaStore.Audio.Media.IS_ALARM, false);
    values.put(MediaStore.Audio.Media.IS_MUSIC, false);

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

    return "Successfully set ringtone.";
}

1 ответ

Для всех, кто сталкивается с этим, я понял это. Это эта линия.

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

Если кто-нибудь узнает, почему это так, мне было бы очень интересно узнать. Спасибо!

Другие вопросы по тегам