uni-app 文本转语音功能在Android targetSdkVersion 设置为30时 小米和oppo部分设备无法工作
uni-app 文本转语音功能在Android targetSdkVersion 设置为30时 小米和oppo部分设备无法工作
类别 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC系统版本 | Windows 10 专业版 |
HBuilderX | 正式 |
HBuilderX版本 | 4.36 |
手机系统 | Android |
手机系统版本 | Android 13 |
手机厂商 | OPPO |
手机机型 | PFJM10 |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
操作步骤:
- 添加插件 https://ext.dcloud.net.cn/plugin?id=4133
- 将 targetSdkVersion 设置为 30
- 测试代码:
const tts = uni.requireNativePlugin("nrb-tts-plugin") tts && tts.init({ "lang":"ZH", "country":"CN" }, res => { if(res.success == 0){ console.log('初始化TTS成功') } }) tts && tts.speak('测试语音播报', {}, e => { console.log(e) }) // 停止播放 tts && tts.stop()
- 打包运行
预期结果:
- targetSdkVersion 设置为 30 和不设置的两种情况,都能正常播报语音
实际结果:
- targetSdkVersion 配置移除,能正常播报语音
- targetSdkVersion 设置为 30,不能正常播报语音
bug描述:
使用插件 https://ext.dcloud.net.cn/plugin?id=4133(原生自带的tts文本转语音)。如果 targetSdkVersion 设置为 30,那么文本转语音无法工作。
通过原生Android代码分析,Android原生需要在 AndroidManifest.xml 的 manifest 节点中添加
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
关键的问题是:如何在uniapp的清单文件中有效地把这个配置加上,在当前的所有文档中没有找到添加 queries 的相关内容
可以在这个插件评论区进行反馈
就是现在不支持在manifest文件中添加Android的这个配置么?
在处理uni-app中文本转语音(Text-to-Speech, TTS)功能时,如果发现在Android targetSdkVersion
设置为30时,小米和OPPO的部分设备无法工作,这通常是由于Android版本和厂商定制的ROM对权限管理、API调用等方面的差异导致的。以下是一个基于Android原生TTS API的uni-app插件调用示例,并尝试解决兼容性问题。
1. 引入原生插件
首先,确保你已经创建了一个uni-app的原生插件项目,用于封装Android的TTS功能。
2. 插件代码实现
AndroidManifest.xml
确保在AndroidManifest.xml
中添加了必要的权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
MainActivity.java
在你的插件的MainActivity.java
中,初始化TTS服务:
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
public class MainActivity extends DCloud_AppActivity implements OnInitListener {
private TextToSpeech tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tts = new TextToSpeech(this, this);
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.getDefault());
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
} else {
Log.i("TTS", "TTS Engine is initialized");
}
} else {
Log.e("TTS", "Initialization Failed!");
}
}
public void speak(String text) {
if (tts != null) {
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);
}
}
}
JS接口调用
在你的uni-app项目中,通过JS调用插件的speak
方法:
// 假设插件ID为 'tts-plugin'
const ttsPlugin = uni.requireNativePlugin('tts-plugin');
function speak(text) {
ttsPlugin.speak({
text: text,
success: function() {
console.log('Text spoken successfully');
},
fail: function(err) {
console.error('Failed to speak text', err);
}
});
}
// 调用示例
speak('Hello, this is a text to speech test.');
3. 注意事项
- 权限请求:在Android 6.0及以上版本,动态请求录音权限(
RECORD_AUDIO
),尽管TTS不直接需要录音权限,但某些设备或ROM可能要求。 - 兼容性测试:在小米和OPPO的多种设备上进行测试,确保TTS服务在所有目标设备上都能正常工作。
- 错误处理:增加详细的错误处理逻辑,以捕获和记录初始化失败、语言不支持等问题。
通过上述方法,你可以尝试解决在targetSdkVersion
30时小米和OPPO设备上TTS功能无法工作的问题。如果问题依旧存在,可能需要进一步分析具体设备的日志,查找特定于设备或ROM的问题。