RgP*_*011 6 android text-to-speech media-player google-text-to-speech android-6.0-marshmallow
在android TTS中使用addSpeech(),您可以将某个文本链接到声音文件.然后,TTS引擎播放文件而不是合成文本的声音(在Android TTS(文本到语音)的addSpeech()中也有问题)并且speak()无法在棉花糖的外部存储器中播放声音文件(api 23)上面,谷歌TTS).这在使用TTS版本3.9.14(和3.10.10)的Android 6.0中不起作用.到目前为止,我没有看到ant post的答案,为什么这在Android 6.0中不起作用.所以我想我会提供更多关于这个问题的数据,这可以帮助有人找出问题所在.(我已将此添加到上面链接中的问题,但主持人删除了它说这不是答案.他们没有建议添加更多这样的数据,除了说另一个问题.因此这个问题.实际上这是关于尚未回答的同一问题的其他数据).所以这里.
在清单中,我使用TTS(后者又使用Media Player)为应用程序提供了读取和写入权限,以播放所提供的语音文件.
android:targetSdkVersion="22"
...
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
请注意,这适用于Android 5.0,但在android 6.0上失败(除非将res/raw中的文件用作语音文件).此外,当它失败时,它似乎在logcat中给出略有不同的错误,具体取决于语音文件是在内部存储还是外部存储.
当res/raw文件夹中的语音文件时,TTS使用资源ID(addSpeech(word,pkgName,resId))正常播放所需的语音文件
当语音文件位于外部存储器上时(/ storage/sdcard0/pkgName/soundFiles/..使用TTS播放会给出EACCES失败日志(对于amr和mp3文件).
09-08 16:57:17.514 1549-7830/? D/MediaPlayer: create failed:
java.io.FileNotFoundException: /storage/emulated/0/pkgName/soundFiles/voice1.amr: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:487)
at java.io.FileInputStream.(FileInputStream.java:76)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1115)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1066)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1003)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:983)
at android.media.MediaPlayer.create(MediaPlayer.java:890
at android.speech.tts.AudioPlaybackQueueItem.run(AudioPlaybackQueueItem.java:58)
at android.speech.tts.AudioPlaybackHandler$MessageLoop.run(AudioPlaybackHandler.java:134)
at java.lang.Thread.run(Thread.java:818)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:473)
at java.io.FileInputStream.(FileInputStream.java:76)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1115)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1066)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1003)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:983)
at android.media.MediaPlayer.create(MediaPlayer.java:890)
at android.speech.tts.AudioPlaybackQueueItem.run(AudioPlaybackQueueItem.java:58)
at android.speech.tts.AudioPlaybackHandler$MessageLoop.run(AudioPlaybackHandler.java:134)
at java.lang.Thread.run(Thread.java:818
Run Code Online (Sandbox Code Playgroud)当语音文件位于内部存储器上时(/data/.../pkgName/soundFiles/ ..使用TTS播放单词会给出以下错误日志(对于amr和mp3文件).
09-08 17:24:23.103 1549-32732/? D/MediaPlayer: create failed:
java.io.IOException: setDataSource failed.
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1120)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1066)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1003)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:983)
at android.media.MediaPlayer.create(MediaPlayer.java:890)
at android.speech.tts.AudioPlaybackQueueItem.run(AudioPlaybackQueueItem.java:58)
at android.speech.tts.AudioPlaybackHandler$MessageLoop.run(AudioPlaybackHandler.java:134)
at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)作为一项实验,在使用TTS的同一个类中创建了一个MediaPlayer对象,并播放了与TTS失败的相同声音文件.没有任何问题他们打得很好.所以看起来只有TTS中MediaPlayer的实例化才有文件权限问题.
任何帮助表示赞赏.
编辑:请注意,已授予运行时权限,因此这不是问题.问题仅限于Google Text to Speech引擎.其他引擎正常工作.
Var*_*ran -1
我认为它失败了,因为你必须在棒棒糖 5.1 操作系统以上的 Android 手机中添加运行时权限(就像用户使用该功能时需要请求许可),
https://developer.android.com/training/permissions/requesting.html
Run Code Online (Sandbox Code Playgroud)
检查此链接以获得对此问题的最佳理解。如果需要知道如何完成,只需检查下面的代码即可。
https://www.androidhive.info/2016/11/android-working-marshmallow-m-runtime-permissions/
Run Code Online (Sandbox Code Playgroud)
这是代码:
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
// MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |