Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在GetFileDir()返回的路径中写入的权限被拒绝_Java_Android_Exception_Permissions_Text To Speech - Fatal编程技术网

Java 在GetFileDir()返回的路径中写入的权限被拒绝

Java 在GetFileDir()返回的路径中写入的权限被拒绝,java,android,exception,permissions,text-to-speech,Java,Android,Exception,Permissions,Text To Speech,我需要用创建一个音频文件 它可以在Android 6上工作(具有重载版本的),但在Android 4.1中,synthesizeToFile返回-1 报告说: 使用指定的参数将给定文本合成为文件。此方法是异步的,即方法只是将请求添加到TTS请求队列中,然后返回 然后,为了知道是哪个错误导致了-1,我在发现此异常的logcat中进行了搜索: E/TextToSpeechService:无法使用/data/data/com.domain.my/files//u 12345\u test.wav,因为

我需要用创建一个音频文件

它可以在Android 6上工作(具有重载版本的),但在Android 4.1中,synthesizeToFile返回
-1

报告说:

使用指定的参数将给定文本合成为文件。此方法是异步的,即方法只是将请求添加到TTS请求队列中,然后返回

然后,为了知道是哪个错误导致了
-1
,我在发现此异常的logcat中进行了搜索:

E/TextToSpeechService:无法使用/data/data/com.domain.my/files//u 12345\u 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);
    }
}
texttospeechtts=newtexttospeech(getApplicationContext(),这是“com.google.android.tts”);
公共无效onInit(int状态)
{
if(status==TextToSpeech.SUCCESS)
{
String textToGenerate=“这是一个测试”;
///data/data/com.domain.my/files由getFilesDir()返回
字符串completePathFile=“/data/data/com.domain.my/files/_12345_test.wav”;
File fileToGenerate=新文件(completePathFile);
String fileName=fileToGenerate.getName();
HashMap HashMap=新的HashMap();
put(TextToSpeech.Engine.KEY\u PARAM\u outrance\u ID,文件名);
int response=tts.synthezetofile
(
文本生成
,hashMap
,completePathFile
);
Log.d(“testTTS”,“生成文件”+fileName+“-response=“+response”);
}
}
我已经用getEngines()检查过是否安装了“com.google.android.tts”

我需要将文件保存在内部存储器中,因此我不能请求外部存储器许可(Android 4.1也是如此?或者对于这个版本,我需要这样做?)


如果我故意将不存在的路径传递给
synthesizeToFile
,logcat中的错误将更改为
file not found exception
,以便该方法正确检查路径
completePathFile
是否存在。

我在搜索我的问题的解决方案时遇到了您的问题。

对我来说,这是TTS中的addspeech()

我认为TTS上的权限问题是因为设备中的TTS是一个单独的应用程序,TTS应用程序没有权限在应用程序的外部或内部存储中写入或读取文件

有趣的是,我在我的应用程序代码中调用了TTS实例并使用了它的所有功能,但它们无法访问我的应用程序的存储。TTS不是我的应用程序,因此我无法代表TTS请求权限。我认为这是谷歌必须处理的一种缺陷

无论如何,我在下面的链接中告诉谷歌团队这个问题。不过他们还没有回应。


您可以在上面的链接中支持我,也可以发布您自己的问题,让他们知道有多个开发人员希望解决TTS权限问题。

我在搜索我的问题的解决方案时遇到了您的问题。

对我来说,这是TTS中的addspeech()

我认为TTS上的权限问题是因为设备中的TTS是一个单独的应用程序,TTS应用程序没有权限在应用程序的外部或内部存储中写入或读取文件

有趣的是,我在我的应用程序代码中调用了TTS实例并使用了它的所有功能,但它们无法访问我的应用程序的存储。TTS不是我的应用程序,因此我无法代表TTS请求权限。我认为这是谷歌必须处理的一种缺陷

无论如何,我在下面的链接中告诉谷歌团队这个问题。不过他们还没有回应。


您可以在上面的链接中支持我,也可以发布您自己的问题,让他们知道有多个开发人员希望TTS权限问题得到解决。

“我必须向synthesizeToFile传递一个与GetFileDir()返回的路径不同的路径?”根据错误,至少在一些Android设备上是这样,您将需要使用而不是。另外,请不要硬编码路径。@commonware谢谢您的评论。我硬编码路径只是为了测试错误,我在完整的脚本中使用了getFilesDir()。我如何才能发现我是否必须使用不同的路径,或者是否可以使用另一种方式按照Android 6版本将文件写入私有内部存储?我不会放弃,直到我发现这是不可能的。有没有任何设备、模拟器或Android API级别的代码(“我用于Android 4.1的代码”)可以工作?这将有助于将问题减少一半。@BooberBunz仿真器也会出现同样的错误。“我必须向synthesizeToFile传递一个与GetFileDir()返回的路径不同的路径?”——基于此错误,至少在某些Android设备上,您需要使用而不是。另外,请不要硬编码路径。@commonware谢谢您的评论。我硬编码路径只是为了测试错误,我在完整的脚本中使用了getFilesDir()。我如何才能发现我是否必须使用不同的路径,或者是否可以使用另一种方式按照Android 6版本将文件写入私有内部存储?我不会放弃,直到我发现这是不可能的。有没有任何设备、模拟器或Android API级别的代码(“我用于Android 4.1的代码”)可以工作?这将有助于将问题一分为二。@BooberBunz仿真器也会出现同样的错误。