首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非活动类/视图适配器类中的TextToSpeech失败:未绑定到TTS引擎

非活动类/视图适配器类中的TextToSpeech失败:未绑定到TTS引擎
EN

Stack Overflow用户
提问于 2017-01-11 15:16:12
回答 0查看 1.2K关注 0票数 0

我已经在选项卡式片段中使用RecyclerView为我的应用程序开发了一个模块。

场景

使用RecyclerView在每个片段中显示了多个动态加载的图像。当用户点击任何图像时,系统都会使用TextToSpeech说出有关该图像的一些信息。

当前代码

我为RecyclerView使用了一个适配器类,它成功地将图像加载到视图中。代码如下:

代码语言:javascript
复制
import android.speech.tts.TextToSpeech;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private ArrayList<CreateList> galleryList;
private Context context;
TextToSpeech tts;

public MyAdapter(Context context, ArrayList<CreateList> galleryList) {
    this.galleryList = galleryList;
    this.context = context;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
.....
}

@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int i) {
.....
.....
viewHolder.img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        .....
        .....
        tts=new TextToSpeech(context, new TextToSpeech.OnInitListener() {

                    @Override
                    public void onInit(int status) {
                        // TODO Auto-generated method stub
                        if(status !=TextToSpeech.ERROR){
                            tts.setLanguage(Locale.UK);
                        }
                    }
                });
        tts.setPitch(pitch);
        tts.setSpeechRate(speechRate);
        tts.speak(StringToSpeak, TextToSpeech.QUEUE_FLUSH, null);
}

@Override
public int getItemCount() {
    return galleryList.size();
}
.....
.....
}

正如您所看到的,我已经在viewHolder上添加了一个OnClickListener,它用onInitListener初始化TTS对象并说出信息。但是,每当我点击片段中的任何图像/视图/项目时,它都不能说明任何问题。在LogCat中没有崩溃,也没有异常,我得到的只是跟随其他消息的消息:

代码语言:javascript
复制
I/TextToSpeech: Sucessfully bound to com.google.android.tts
W/TextToSpeech: speak failed: not bound to TTS engine

我试着调试应用程序,发现在初始化TTS对象时,它在下面这一行返回engine=Null

代码语言:javascript
复制
tts=new TextToSpeech(context, new TextToSpeech.OnInitListener() {
....});

在扩展Activity的其他类中,代码和TTS工作得很好,但在我的Adapter/Non-Activity类中,它不会启动TTS,因为它无法绑定到TTS引擎。我尝试用下面的函数在适配器类中实现接口implements TextToSpeech.OnInitListener

代码语言:javascript
复制
@Override
public void onInit(int status) {

    if (status == TextToSpeech.SUCCESS) {
        tts.setLanguage(Locale.UK);
    }
}

但没有结果:(我还试图创建一个扩展Activity的抽象类,它在其OnCreate()中实现TTS,并包含一个自定义函数SpeakMessage(),我尝试在我的Adapter class中调用该函数,但失败了。我花了几个小时试图弄清楚这个问题和它的解决方案,在StackOverFlow和其他网站上深入研究了每一个与TTS相关的问题,但是没有找到任何解决我的问题的方法。请帮我找出问题所在并找出正确的解决方案。提前谢谢你。还有一件事,在视图的同一动作监听器中,使用MediaPlayer播放录制的音频消息工作得很完美。唯一的问题是使用TTS说字符串消息。

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41584831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档