Android 我如何允许TTS将文件写入我的应用程序';s目录?

Android 我如何允许TTS将文件写入我的应用程序';s目录?,android,file-permissions,text-to-speech,permission-denied,Android,File Permissions,Text To Speech,Permission Denied,我想将TextToSpeech引擎的输出写入我的应用程序的缓存目录。为了让TTS在那里写,我首先必须授予它这样做的权限。但我不知道怎么做。我理解,通常通过将FileDescriptor交给用户,从而授予访问特定文件的权限,就可以解决此类问题。但我不能用TTS实现这一点,因为TextToSpeech.synthesizeToFile方法只接受作为字符串的文件路径,没有FileDescriptor。那怎么办呢 为了说明TTS确实没有权限写入我的应用程序目录,下面是代码…: TextToSpeech

我想将TextToSpeech引擎的输出写入我的应用程序的缓存目录。为了让TTS在那里写,我首先必须授予它这样做的权限。但我不知道怎么做。我理解,通常通过将
FileDescriptor
交给用户,从而授予访问特定文件的权限,就可以解决此类问题。但我不能用TTS实现这一点,因为TextToSpeech.synthesizeToFile方法只接受作为字符串的文件路径,没有
FileDescriptor
。那怎么办呢

为了说明TTS确实没有权限写入我的应用程序目录,下面是代码…:

TextToSpeech mTts = new new TextToSpeech(context, this);
mTts.synthesizeToFile(text, null, getCacheDir() + "/" + "speech.wav");
和调试器日志:

08-20 14:46:11.257: ERROR/TtsService(336): Can't create
/data/data/com.myorg.myapp/cache/speech.wav due to exception java.io.IOException: Permission denied
在实际设备中不起作用。它只适用于AVD

我也一直在尝试,使用原始的Pico TTS引擎和第三方TTS引擎,尝试写入SD卡或内部内存(在根设备上):

但是,正如您所指出的,该方法返回
TextToSpeech.SUCCESS
,而不实际创建文件


如果您必须将TTS输出记录到WAV文件中,请将耳机输出连接到电脑声卡中的aux输入,并使用任何录制软件来捕获该输出。

TextToSpeech.synthezetofile()确实可以在真实设备上工作,尽管有点麻烦。 我也有同样的问题,但最终还是解决了。我使用的代码是:

speakTextTxt = speakText.getText().toString();
HashMap<String, String> myHashRender = new HashMap<String, String>();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_SAVE_ID);

String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
File appTmpPath = new File(exStoragePath + "/sounds/");
appTmpPath.mkdirs();
String tempFilename = "tmpaudio.wav";
tempDestFile = appTmpPath.getAbsolutePath() + "/" + tempFilename;

mTts.synthesizeToFile(speakTextTxt, myHashRender, tempDestFile);
speakTextTxt=speakText.getText().toString();
HashMap myHashRender=新建HashMap();
myHashRender.put(TextToSpeech.Engine.KEY_参数_话语_ID,话语_保存_ID);
字符串exStoragePath=Environment.getExternalStorageDirectory().getAbsolutePath();
File appTmpPath=新文件(exStoragePath+“/sounds/”;
appTmpPath.mkdirs();
字符串tempFilename=“tmpaudio.wav”;
tempDestFile=appTmpPath.getAbsolutePath()+“/”+tempFilename;
合成文件(speakTextTxt、myHashRender、tempDestFile);
然而,今天我发现了另一件很奇怪的事情。我切换到另一台计算机进行开发,然后又开始出现同样的错误“java.io.IOException:权限被拒绝”。 然后我进入Android SDK管理器,确保所有Android版本都安装了“SDK平台”和“Goole Inc.的Google API”软件包。我不确定到底是哪个软件包版本修复了它,但它又开始工作了。 显然,您可以拥有完美的代码,但您的开发环境可能会出现一些问题。
我希望这能帮助一些人。

建议
TextToSpeech.synthesizeToFile()
只在AVD上工作,而不是在真正的手机上。。。这很奇怪。我将进一步调查是否确实如此,并建议在实际设备上使用
TextToSpeech.synthezetofile()
。但是怎么做呢???这太疯狂了:我设法不再获得
java.io.IOException
,而是接收到成功消息
合成到/mnt/sdcard/test.wav
,但是test.wav在文件系统的任何地方都找不到(而且肯定不是在/mnt/sdcard上)。发生了什么事?刚刚遇到了另一个与此相关的问题。如果选择“USB大容量存储”作为设备上的USB连接,也会出现此错误。当选择任何其他选项时,它都可以正常工作。我相信这是由于计算机将设备安装为usb驱动器,此时除了计算机之外,其他任何设备都无法访问该设备。您在哪个设备(品牌和型号,根?)上使用该设备+1目前,尽管我在5款不同的Android手机上进行了测试,但没有一款得到保存的文件。我至少在摩托罗拉Atrix、摩托罗拉Xoom和三星Moment上进行了测试。而且,这些设备没有根。我在Android 2.x设备上进行了测试。您的工作设备运行哪些版本的Android?
speakTextTxt = speakText.getText().toString();
HashMap<String, String> myHashRender = new HashMap<String, String>();
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_SAVE_ID);

String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
File appTmpPath = new File(exStoragePath + "/sounds/");
appTmpPath.mkdirs();
String tempFilename = "tmpaudio.wav";
tempDestFile = appTmpPath.getAbsolutePath() + "/" + tempFilename;

mTts.synthesizeToFile(speakTextTxt, myHashRender, tempDestFile);