отказано в разрешении на запись в путь, возвращенный getFilesDir () - PullRequest
1 голос
/ 02 июля 2019

Мне нужно создать аудиофайл с помощью synthesizeToFile .

. Он работает на Android 6 (с перегруженной версией synthesizeToFile ), но на Android 4.1 * 1007.* возвращает -1.

Официальная документация synthesizeToFile гласит:

Синтезирует данный текст в файл с использованием указанных параметров.Этот метод является асинхронным, то есть метод просто добавляет запрос в очередь запросов TTS, а затем возвращает .

Затем, чтобы узнать, какая ошибка вызвала поиск -1.в logcat, где я нашел это исключение:

E / TextToSpeechService: не могу использовать /data/data/com.domain.my/files/_12345_test.wav из-за исключения java.io.IOException: открыть не удалось: EACCES (В доступе отказано)

Существует какая-то другая конфигурация / настройка системы между Android 6 и 4.1, которая вызывает эту ошибку?

Я долженпередать synthesizeToFile путь, отличный от пути, возвращаемого getFilesDir()?

Я должен установить права доступа к файлу?

Код, который я использовал для Android 4.1:

TextToSpeech tts = new TextToSpeech(getApplicationContext(), this, "com.google.android.tts");

public void onInit(int status)
{
    if (status == TextToSpeech.SUCCESS)
    {
        String textToGenerate = "this is a test";
        // /data/data/com.domain.my/files is returned by getFilesDir()
        String completePathFile = "/data/data/com.domain.my/files/_12345_test.wav";

        File fileToGenerate = new File(completePathFile);
        String fileName = fileToGenerate.getName();

        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, fileName);

        int response = tts.synthesizeToFile
        (
                textToGenerate
                , hashMap
                , completePathFile
        );
        Log.d("testTTS", "Generation file " + fileName + " - response = " + response);
    }
}

Я уже проверил с помощью getEngines (), что установлено com.google.android.tts.

Мне нужно сохранить файл во внутреннем хранилище, поэтому я не должен запрашивать разрешение на внешнее хранение (это правдатакже для Android 4.1? или для этой версии e мне нужно сделать so?).

Если я намеренно передам synthesizeToFile путь, который не существует, ошибка в logcat изменится на file not found exception, так что метод правильно проверит, что путь completePathFile существует.

...