2012-03-18 30 views
0

私は自分のマネージャークラス内で音声認識マネージャーを構築しようとしています。TTS(Text to Speech):自分のクラスのマネージャー

は現在、私のコードは次のようになります。TTSモジュールを初期化しようとしたとき

public class TTSManager extends Activity implements OnInitListener{ 

private TextToSpeech myTTS; 
private int MY_DATA_CHECK_CODE = 0; 
private boolean readyToSpeak = false; 

public TTSManager() 
{ 
    ; 
} 

public void checkIfTTSModulesInstalled() 
{ 
    Intent checkIntent = new Intent(); 
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 
} 


protected void onActivityResult(
     int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_DATA_CHECK_CODE) { 
     if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) 
     { 
      // success, create the TTS instance 
      myTTS = new TextToSpeech(this, this); 
     } 
     else 
     { 
      // missing data, install it 
      Intent installIntent = new Intent(); 
      installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent); 
     } 
    } 
} 


@Override 
public void onInit(int status) 
{ 
    if (status == TextToSpeech.SUCCESS) 
    { 
     if(myTTS.isLanguageAvailable(Locale.US) == TextToSpeech.LANG_AVAILABLE) 
     { 
      myTTS.setLanguage(Locale.US); 
      readyToSpeak = true; 
     } 
    } 
} 

public void speak(String text) 
{ 
    if (readyToSpeak) 
     myTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null); 
} 

} 

は、残念ながら私は、nullポインタ例外を受けています。 TTSマネージャを構築するにはどうすればよいですか?TTSマネージャを独自のクラスにするにはどうしたらいいですか?

答えて

2

あなたのマネージャークラスはActivityまで延長してはいけません。もしあなたがそうしたら、他の活動でそれを使う方法はありません。それはあなたの目標です(それはAndroidによって初期化されなければならない、単にnew TTSManager()と呼んでも有効な活動にはならない)。それを通常のクラスにして、それを必要とするすべてのメソッドにContextパラメータを渡します。

NPEに関しては、スタックトレースを見ることができます。

ここに私が書いたようなものがありますが、いくつかの参考になるかもしれません。これは、エンジンを切り替えるためのコードの多くを持っていますが、あなたは単にデフォルトを使用している場合ことを無視することができます。

http://code.google.com/p/wwwjdic/source/browse/branches/2.0/wwwjdic/src/org/nick/wwwjdic/TtsManager.java

+0

こんにちは、TTSが別の方法でインストールされているかどうかを確認しています。特定のパッケージ(-name)がインストールされているかどうかを確認するだけですか? – nr1

+0

特定のTTSエンジンがインストールされているかどうかを確認していますが、デフォルトのエンジンを使用している場合は、その必要はありません。 'startActivityForResult()'を使用してTTSデータがインストールされているかどうかを確認する場合は、 'onActivityResult()'が実際のアクティビティに含まれている必要があります。重要なことは、マネージャは 'TextToSpeech'オブジェクトをホストし、初期化、設定、破棄を行うことができますが、アクティビティによってトリガされる必要があることです。 –

+0

もう1つ質問:TTSが利用可能かどうかを確認するための安全な方法がありますか?特定のパッケージ(名前)がデバイスで使用可能かどうかを確認するだけでは十分ではありませんか? – nr1

1

私は今、このようにそれをしなかった(この方法は「大丈夫ですかどうかわからされていないが、 "):

import java.util.Locale; 

import android.content.Context; 
import android.content.Intent; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 

public class TTSManager 
{ 
private TextToSpeech myTTS; 
private boolean readyToSpeak = false; 
private Context context; 

public TTSManager(Context baseContext) 
{ 
    this.context = baseContext; 
} 

public void initOrInstallTTS() 
{ 
    myTTS = new TextToSpeech(context, new OnInitListener() 
    {    
     @Override 
     public void onInit(int status) 
     { 
      if (status == TextToSpeech.SUCCESS) 
      { 
       myTTS.setLanguage(Locale.US); 
       readyToSpeak = true; 
      } 
      else 
       installTTS(); 
     } 
    }); 
} 

private void installTTS() 
{ 
    Intent installIntent = new Intent(); 
    installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
    context.startActivity(installIntent); 
} 

public void speak(String text) 
{  
    if (readyToSpeak) 
     myTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null); 
} 

} 
+0

それは私のために働いていない – mahdi

関連する問題