почему TextToSpeech synthesizeToFile возвращает -1? - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь создать файл с synthesizeToFile:

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";

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

        // this works on Android 6
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        {
            Bundle bundleTts = new Bundle();
            bundleTts.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, fileName);

            tts.synthesizeToFile
            (
                    textToGenerate
                    , bundleTts
                    , fileToGenerate
                    , fileName
            );
        }
        // this doesn't works on Android 4.1: response is -1
        else
        {
            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);
        }
    }
}

На устройстве с Android 6 метод synthesizeToFile работает нормально.

На устройстве с Android 4.1synthesizeToFile метод возвращает -1.

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

Как я могу отладить свой скрипт, чтобы выяснить, почемуsynthesizeToFile возвращает -1?

Есть альтернативный способ создания этого файла с помощью TTS?

Мне нужно сделать это во внутренней памяти (путь, возвращаемый getFilesDir())поэтому я не должен запрашивать разрешение на внешнее хранение.

РЕДАКТИРОВАТЬ:

В logcat я нашел эту ошибку:

E/TextToSpeechService: Can't use /data/data/com.domain.my/files/_12345_test due to exception java.io.IOException: open failed: EACCES (Permission denied)

Я уже пытался:

setWritable(true)

и

setWritable(true, true)

Но даже если оба возвращают true, исключение все равно возникает.

Итак, как теперь решить эту проблему?

1 Ответ

0 голосов
/ 02 июля 2019

Я обнаружил, что, чтобы узнать причину значения -1, возвращаемого synthesizeToFile, мне нужно увидеть в logcat:

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

Теперь я должен знать, почему происходит это исключение ...

...