我需要使用synthesizeToFile创建一个音频文件。
它可在Android 6(具有synthesizeToFile的重载版本)上运行,但在Android 4.1中,synthesizeToFile
返回-1
。
synthesizeToFile
official documentation说:
使用指定的参数将给定的文本合成到文件中。此方法是异步的,即方法只是将请求添加到TTS请求队列中,然后返回。
然后,要知道是哪个错误导致了-1
我在创建此异常的日志猫中进行了搜索:
E / TextToSpeechService:由于出现java.io.IOException异常,无法使用/data/data/com.domain.my/files/_12345_test.wav:打开失败: 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来说也是如此?或者对于此版本,我需要这样做吗?)。
如果我故意将不存在的路径传递给synthesizeToFile
,则logcat中的错误将更改为file not found exception
,以便该方法正确检查路径completePathFile
是否存在。>
答案 0 :(得分:0)
我遇到了您的问题,正在寻找解决方案。 Use of sound files in TTS on Marshmallow (Android 6) fails with permission issues
对我来说,它是TTS中的addspeech()。
我认为TTS的权限问题来自以下事实:设备中的TTS是单独的应用程序,并且TTS应用程序无权在应用程序的外部或内部存储中写入或读取文件。
我在应用程序代码中调用TTS实例并使用其所有功能很有趣,但是它们无法访问我的应用程序的存储。 TTS不是我的应用程序,因此我无法代表TTS请求权限。我认为这是Google必须处理的错误。
无论如何,我会在下面的链接中让Google小组了解此问题。他们还没有回应。 https://issuetracker.google.com/issues/152671139
您可以在上面的链接中支持我,或者您可以发布自己的问题,以使他们知道有多个开发人员希望TTS许可问题得到解决。