RingtonePreference не удается добавить новые мелодии на Android 8.1 - PullRequest
0 голосов
/ 17 января 2019

В XML-файле у меня есть следующий код. Я могу выбрать звук в формате mp3, нажав кнопку с рекламным рингтоном на экране ringtonepref, но при этом я вижу следующее исключение. Раньше это работало, но после обновления до Android 8 его не работает.

Как можно

 <RingtonePreference


android:defaultValue="content://settings/system/notification_sound"
        android:key="ringtone_pref"
        android:ringtoneType="all"
        android:title="@string/hr_beep_tone_title"
        android:summary="@string/hr_beep_tone_summary"/> 


 01-17 00:21:15.785 15503-16432/? E/RingtonePickerActivity: Unable to add new ringtone
        java.lang.IllegalArgumentException: Unsupported ringtone type: 7
            at android.media.RingtoneManager.getExternalDirectoryForType(RingtoneManager.java:1088)
            at android.media.RingtoneManager.addCustomExternalRingtone(RingtoneManager.java:1056)
            at com.android.providers.media.RingtonePickerActivity$2.doInBackground(RingtonePickerActivity.java:281)
            at com.android.providers.media.RingtonePickerActivity$2.doInBackground(RingtonePickerActivity.java:278)
            at android.os.AsyncTask$2.call(AsyncTask.java:333)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
            at java.lang.Thread.run(Thread.java:764)

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Копирован исходный код android-27, похоже, что addCustomExternalRingtone копирует выбранный вами звуковой файл, но данный параметр TYPE_ALL не позволяет определить каталог для сохранения.

addCustomExternalRingtone

   @WorkerThread
    public Uri addCustomExternalRingtone(@NonNull final Uri fileUri, final int type)
            throws FileNotFoundException, IllegalArgumentException, IOException {

        ...

        // Choose a directory to save the ringtone. Only one type of installation at a time is
        // allowed. Throws IllegalArgumentException if anything else is given.
        final String subdirectory = getExternalDirectoryForType(type);

        // Find a filename. Throws FileNotFoundException if none can be found.
        final File outFile = Utils.getUniqueExternalFile(mContext, subdirectory,
                Utils.getFileDisplayNameFromUri(mContext, fileUri), mimeType);

        // Copy contents to external ringtone storage. Throws IOException if the copy fails.
        try (final InputStream input = mContext.getContentResolver().openInputStream(fileUri);
                final OutputStream output = new FileOutputStream(outFile)) {
            Streams.copy(input, output);
        }

        // Tell MediaScanner about the new file. Wait for it to assign a {@link Uri}.
        try (NewRingtoneScanner scanner =  new NewRingtoneScanner(outFile)) {
            return scanner.take();
        } catch (InterruptedException e) {
            throw new IOException("Audio file failed to scan as a ringtone", e);
        }
    }

И getExternalDirectoryForType, где ошибка действительно возникает.

    private static final String getExternalDirectoryForType(final int type) {
        switch (type) {
            case TYPE_RINGTONE:
                return Environment.DIRECTORY_RINGTONES;
            case TYPE_NOTIFICATION:
                return Environment.DIRECTORY_NOTIFICATIONS;
            case TYPE_ALARM:
                return Environment.DIRECTORY_ALARMS;
            default:
                throw new IllegalArgumentException("Unsupported ringtone type: " + type);
        }
    }

Дело в том, что RingtonePickerActivity не может решить, какой тип выбрать для сохранения, и, наконец, дать TYPE_ALL.

Похоже, вам следует переопределить точку выбора файла и передать uri и тип в RingtoneManager.addCustomExternalRingtone или сохранить файл самостоятельно.

0 голосов
/ 19 января 2019

Согласно документации Android, тип 7 ​​- TYPE_ALL, а не TYPE_RINGTONE. Я думаю, что вы выбрали песню из другого каталога из "рингтонов". Я не пробовал, но почти все приложения для выбора мелодии звонка перемещают файл песни в эту папку при выборе пользовательской мелодии звонка, возможно, вы можете попробовать.

...