从另一个类调用TextToSpeech

时间:2017-08-31 09:34:03

标签: java android android-context

我试图在另一个类中调用TextToSpeech。 以下是我的课程现在的样子:

//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  private SpeechRecognizer sr;
  sr.setRecognitionListener(new Listener());
}


//Listener.java
public class Listener implements RecognitionListener() {
  public void onResults(Bundle 
    MainActivity theMainActivity = new MainActivity();

    //the following line always breaks the code:
    tts = new TextToSpeech(theMainActivity, new TextToSpeech.OnInitListener() {/*...*/});
  }
}

对于上下文,其上下文中的文件为on GitHub。 GitHub上的版本是工作版本,其中所有内容都在MainActivity.java,但我正在尝试将Listener移到自己的类Listener.java中。

收到的错误是java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ContentResolver android.content.Context.getContentResolver()' on a null object reference

现在我对我的尝试进行了长时间的解释......

我尝试了什么

当我尝试用theMainActivity替换MainActivity.this并收到错误MainActivity is not an enclosing class时。我知道我可以使Listener成为一个静态类(但不会编译),或者我可以实例化新的MainActivity()。new Listener()(但不会编译)。 有人问完全相同的问题here本身被标记为重复。所以我的问题是重复的副本......但是没有给出明确的答案。

我明白我应该以某种方式solve the NullPointerException。但是,当我在使用之前记录该值时,它根本不为空。相反,theMainActivity com.package.name.MainActivity@b76325e中的Log.d值为new MainActivity()。因此,如果它首先不是null,但是抛出一个null错误,那怎么能修复呢?

所以我想也许这是特定于Android的。毕竟,它与android ContentResolver有关... 所以我读了这个question并认为创建一个应用程序context会起作用,除了我的MainActivity扩展AppCompactActivity而不是Application,所以我不能编写MainActivity.context。

我理解我错过了一些基本的Java理解。我知道应用程序有一个Application和Activity上下文。我知道问题与在Listener.java中获取上下文有关。我也知道我需要将上下文带入Listener.java。我知道只是在Listener.java中运行{{1}}可能是一个坏主意,因为我应该使用原始的MainActivity Activity上下文,它首先调用onResults。我能想到的最好的解决方案是以某种方式使上下文成为某种可以由任何类访问的“全局”,或类似的东西......但我一直陷入诸如“它不是静态的”和“不是你”之类的陷阱无法调用使用android.content.Context,因为你没有使用android.app.Application“。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

试试这个

//Listener.java
public class Listener implements RecognitionListener() {
 MainActivity instance;
 public Listener(MainActivity mainActivity){
        this.instance = mainActivity;
 }
  public void onResults(Bundle 
    MainActivity theMainActivity = new MainActivity();

    //the following line always breaks the code:
    tts = new TextToSpeech(instance, new TextToSpeech.OnInitListener() {/*...*/});
  }
}
//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  private SpeechRecognizer sr;
  sr.setRecognitionListener(new Listener(this));
}