編集:これについてはすでに言及する必要がありましたが、このコードをサービスで実行しています。アプリ全体がウィジェット ボタンでオン/オフされ、アクティビティはありません。
更新: SDK ソースをプロジェクトにアタッチして、失敗が発生した場所をより正確に把握できるようにしましたが、見た目からすると、パブリック API のみが含まれているため、あまり役に立たないようです.. .この問題を解決するための少なくともデバッグアプローチを提案できる人はいますか? 私はちょっと立ち往生しています。
Android の音声認識パッケージを使用して、ユーザーの音声を録音し、テキストに変換しようとしています。残念ながら、リスニングを開始しようとすると、具体的なことを示さない ANR エラーが表示されます。
SpeechRecognizer API が示すように、メイン スレッドから呼び出そうとすると、RuntimeException がスローされます。これは、処理に負荷がかかりすぎたのではないかと思います... しかし、他のアプリケーションがこの目的で Android API を使用していることは知っており、通常はかなりきびきびしています。
java.lang.RuntimeException: SpeechRecognizer should be used only from the application's main thread
これは、サービスから呼び出そうとしているコードの (トリミングされた) サンプルです。これは適切なアプローチですか?
お時間を割いていただきありがとうございます。これは私がまだ乗り越えられないハードルでした。
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
"com.domain.app");
SpeechRecognizer recognizer = SpeechRecognizer
.createSpeechRecognizer(this.getApplicationContext());
RecognitionListener listener = new RecognitionListener() {
@Override
public void onResults(Bundle results) {
ArrayList<String> voiceResults = results
.getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
if (voiceResults == null) {
Log.e(getString(R.string.log_label), "No voice results");
} else {
Log.d(getString(R.string.log_label), "Printing matches: ");
for (String match : voiceResults) {
Log.d(getString(R.string.log_label), match);
}
}
}
@Override
public void onReadyForSpeech(Bundle params) {
Log.d(getString(R.string.log_label), "Ready for speech");
}
@Override
public void onError(int error) {
Log.d(getString(R.string.log_label),
"Error listening for speech: " + error);
}
@Override
public void onBeginningOfSpeech() {
Log.d(getString(R.string.log_label), "Speech starting");
}
};
recognizer.setRecognitionListener(listener);
recognizer.startListening(intent);