uni-app 文本转语音功能在Android targetSdkVersion 设置为30时 小米和oppo部分设备无法工作

发布于 1周前 作者 vueper 来自 Uni-App

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

操作步骤:

  1. 添加插件 https://ext.dcloud.net.cn/plugin?id=4133
  2. 将 targetSdkVersion 设置为 30
  3. 测试代码:
    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()
    
  4. 打包运行

预期结果:

  1. targetSdkVersion 设置为 30 和不设置的两种情况,都能正常播报语音

实际结果:

  1. targetSdkVersion 配置移除,能正常播报语音
  2. 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 的相关内容


3 回复

可以在这个插件评论区进行反馈


就是现在不支持在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的问题。

回到顶部