android.speech.tts.TextToSpeech.setLanguage(java.util.Locale)' on a null object reference。

4

我的应用程序崩溃了,在logcat中我找到了以下错误:

android.speech.tts.TextToSpeech.setLanguage(java.util.Locale)' 的空对象引用

这是我的类:

public class cl_txt2speech {

    TextToSpeech txt2speech;
    Activity context;

    String txt2speech_current_language = "" ;
    boolean txt2speech_available = false ;

    //@Override
    protected void onCreate(Bundle savedInstanceState) {

        txt2speech = new TextToSpeech(context.getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status != TextToSpeech.ERROR) {
                    txt2speech_available = true ;
                }
            }
        });
    }

    void txt2speech_change_language( String lang )
    {
        if( lang=="fr" )
        {
            txt2speech.setLanguage(Locale.FRANCE);
        }
        else if( lang=="en" )
        {
            txt2speech.setLanguage(Locale.UK);
        }
        else if( lang=="es" )
        {
            Locale locSpanish = new Locale("spa", "MEX");
            txt2speech.setLanguage(locSpanish);
        }
        txt2speech_current_language = lang ;
    }

    void txt2speech_speak( String lang , String txt )
    {
        if( lang != txt2speech_current_language ){ txt2speech_change_language( lang ); }
        txt2speech.speak(txt, TextToSpeech.QUEUE_FLUSH, null);
    }
}

下面是我如何使用它

cl_txt2speech txt2speech = new cl_txt2speech();
txt2speech.txt2speech_speak( "fr" , "test, 1 2 3" );

我不明白问题出在哪里,我在一开始就定义了TextToSpeech txt2speech;

更新1:我加了一些System.out.println()来跟踪发生了什么,看起来onCreate中的代码从未执行。所以问题一定来自于我如何使用我的类。

更新2:

我最终将所有内容移动到我的fullscreenActivity.java文件中,而不是使用一个类,以查看发生了什么。

public class FullscreenActivity extends AppCompatActivity implements
        TextToSpeech.OnInitListener{
...
public TextToSpeech txt2speech;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    txt2speech = new TextToSpeech(this, this);
    ...
}

@Override
public void onInit(int status) {
    System.out.println( "--------------- onInit() -------------" );
    if (status != TextToSpeech.ERROR) {
        txt2speech_available = true;
    }
}

这里 onInit 也从未被触发...

此外,在调用 txt2speech.getDefaultLanguage() 时,出现错误 "getDefaultLanguage failed: not bound to TTS engine"。


您需要在设备上安装TTS引擎:一定要安装一个 - 这里有一个来自谷歌的引擎:https://play.google.com/store/apps/details?id=com.google.android.tts&hl=en_US&gl=US。 - user2711811
我执行了一下,然后通过在Chrome浏览器中运行我的HTML5游戏来检查它是否正常工作。 - Diego
1
实际上,TTS引擎确实存在问题。我卸载了它并重新安装了它,现在它可以正常工作了。一些应用程序可能会对其进行干扰。 - Diego
好消息。另外请注意字符串比较(下一个问题)-不要使用==:https://dev59.com/DnRB5IYBdhLWcg3wyqEd#513839 - user2711811
3个回答

1

txt2speech对象从未被初始化。请按照以下方式编辑您的代码,然后您就可以在某个活动中创建cl_txt2speech类的对象:

public class cl_txt2speech {

    TextToSpeech txt2speech;

    String txt2speech_current_language = "" ;
    boolean txt2speech_available = false ;

    public cl_txt2speech(Context context) {

        txt2speech = new TextToSpeech(context.getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status != TextToSpeech.ERROR) {
                    txt2speech_available = true ;
                }
            }
        });
    }

    void txt2speech_change_language( String lang )
    {
        if( lang=="fr" )
        {
            txt2speech.setLanguage(Locale.FRANCE);
        }
        else if( lang=="en" )
        {
            txt2speech.setLanguage(Locale.UK);
        }
        else if( lang=="es" )
        {
            Locale locSpanish = new Locale("spa", "MEX");
            txt2speech.setLanguage(locSpanish);
        }
        txt2speech_current_language = lang ;
    }

    void txt2speech_speak( String lang , String txt )
    {
        if( lang != txt2speech_current_language ){ txt2speech_change_language( lang ); }
        txt2speech.speak(txt, TextToSpeech.QUEUE_FLUSH, null);
    }
}

这里是如何使用:

cl_txt2speech txt2speech = new cl_txt2speech(this);
txt2speech.txt2speech_speak( "fr" , "test, 1 2 3" );

应用程序崩溃了,在“运行”或“日志”中没有任何信息可以知道发生了什么。 - Diego
因为上下文为空。从活动中传递上下文。我编辑了代码。 - Hossein
当我使用这个时,仍然会崩溃并且没有任何信息。:\ - Diego

1
你注释掉了方法onCreate()上的@Override注解,这样它就成为了一个没有意义且永远不会被调用的方法。
编辑:我刚看到你的类没有扩展Activity,所以你无法覆盖该方法。尝试将该代码重构到你类的构造函数中。

我添加了“extends Activity”并取消了@override的注释,但onCreate()仍然没有被调用。 - Diego
你怎么称呼这个类?你是用 new 关键字实例化它吗?因为如果你想要执行 onCreate() 方法,那么这样做是行不通的。你必须使用 startActivity(),这里有一个教程:https://developer.android.com/training/basics/firstapp/starting-activity - moeux
我不想改变活动,我只想在我的主活动中使用我编写的函数。 - Diego
就像我之前所说的,你需要将那段代码放到你的类构造函数中。然后你就可以在主活动中创建一个新的类实例并且无障碍地使用它了。 - moeux

0

你是否忘记了在 onCreate() 方法中调用 super

尝试添加它,然后再试一下。我相信如果没有调用 super,你的 onCreate() 方法将不会执行。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

}

我已经有完全相同的代码行了。 - Diego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接