2012-05-07 2 views
2

Я пользуюсь этой деятельностью, voicerecognition.java, предоставленной Google, чтобы позволить пользователю выбирать язык, говорить в трубку и просматривать то, что они только что сказали. Он работает, когда я вынимаю все языковые константы, но когда я помещаю языковые параметры, я получаю ошибки. Например:Recognizer Intent не может определить свои константы

  • Метод getVoiceDetailsIntent (VoiceRecognition) не определено для типа
  • EXTRA_SUPPORTED_LANGUAGES не может быть разрешен или не является полем
  • EXTRA_LANGUAGE_PREFERENCE не может быть разрешен или не является полем
  • Метод run() типа new Runnable() {} должен переопределить метод суперкласса

Я думал, что мне просто нужно будет обновить SDK или что-то в этом роде все в порядке. Я не знаю, что не так, потому что я скопировал действие точно так же, как и на ссылку.

package com.sample.voicerecog; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.content.pm.ResolveInfo; 
import android.os.Bundle; 
import android.os.Handler; 
import android.speech.RecognizerIntent; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.SpinnerAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 
import java.util.ArrayList; 
import java.util.List; 

public class VoiceRecognition extends Activity implements OnClickListener {  
private static final String TAG = "VoiceRecognition";  
private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;  
private ListView mList;  
private Handler mHandler;  
private Spinner mSupportedLanguageView;  

/**  
* Called with the activity is first created.  
*/  
@Override  
public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);   
    mHandler = new Handler();   

    // Inflate our UI from its XML layout description.   
    setContentView(R.layout.voice_recognition);   

    // Get display items for later interaction   
    Button speakButton = (Button) findViewById(R.id.btn_speak);   
    mList = (ListView) findViewById(R.id.list);   
    mSupportedLanguageView = (Spinner) findViewById(R.id.supported_languages);   
    // Check to see if a recognition activity is present   
    PackageManager pm = getPackageManager();   
    List<ResolveInfo> activities = pm.queryIntentActivities(    
      new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);   
    if (activities.size() != 0) {    
     speakButton.setOnClickListener(this);   
    } else {   
     speakButton.setEnabled(false);  
     speakButton.setText("Recognizer not present"); 
    }  

    // Most of the applications do not have to handle the voice settings. If the application  
    // does not require a recognition in a specific language (i.e., different from the system  
    // locale), the application does not need to read the voice settings.  
    refreshVoiceSettings(); 
} 

/** 
* Handle the click on the start recognition button.  
*/  
public void onClick(View v) {   
    if (v.getId() == R.id.btn_speak) {   
     startVoiceRecognitionActivity();   
    }  
} 

/**  
* Fire an intent to start the speech recognition activity.  
*/  
private void startVoiceRecognitionActivity() {  
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);   

    // Display an hint to the user about what he should say.  
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");  

    // Given an hint to the recognizer about what the user is going to say  
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,    
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  

    // Specify how many results you want to receive. The results will be sorted 
    // where the first result is the one with higher confidence.  
    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5); 

    // Specify the recognition language. This parameter has to be specified only if the  
    // recognition has to be done in a specific language and not the default one (i.e., the 
    // system locale). Most of the applications do not have to set this parameter. 
    if (!mSupportedLanguageView.getSelectedItem().toString().equals("Default")) {  
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,     
       mSupportedLanguageView.getSelectedItem().toString()); 
    }  
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
}  

/**  
* Handle the results from the recognition activity.  
*/  
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {   
     // Fill the list view with the strings the recognizer thought it could have heard   
     ArrayList<String> matches = data.getStringArrayListExtra(     
       RecognizerIntent.EXTRA_RESULTS);   
     mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,  
       matches));  
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

private void refreshVoiceSettings() {  
    Log.i(TAG, "Sending broadcast");  
    sendOrderedBroadcast(RecognizerIntent.getVoiceDetailsIntent(this), null, 
      new SupportedLanguageBroadcastReceiver(), null, Activity.RESULT_OK, null, null); 
} 

private void updateSupportedLanguages(List<String> languages) {  
    // We add "Default" at the beginning of the list to simulate default language. 
    languages.add(0, "Default"); 

    SpinnerAdapter adapter = new ArrayAdapter<CharSequence>(this,  
      android.R.layout.simple_spinner_item, languages.toArray( 
        new String[languages.size()])); 
    mSupportedLanguageView.setAdapter(adapter); 
} 

private void updateLanguagePreference(String language) {  
    TextView textView = (TextView) findViewById(R.id.language_preference);  
    textView.setText(language); 
} 

/**  
* Handles the response of the broadcast request about the recognizer supported languages.  
*  
* The receiver is required only if the application wants to do recognition in a specific language.  
*/ 

private class SupportedLanguageBroadcastReceiver extends BroadcastReceiver {  
    @Override 
    public void onReceive(Context context, final Intent intent) {  
     Log.i(TAG, "Receiving broadcast " + intent); 
     final Bundle extra = getResultExtras(false); 
     if (getResultCode() != Activity.RESULT_OK) {  
      mHandler.post(new Runnable() {  
       @Override   
       public void run() {    
        showToast("Error code:" + getResultCode());  
       }  
      }); 
     } 
     if (extra == null) {   
      mHandler.post(new Runnable() {   
       @Override    
       public void run() { 
        showToast("No extra");  
       } 
      }); 
     }  
     if (extra.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) {   
      mHandler.post(new Runnable() {  
       @Override  
       public void run() {   
        updateSupportedLanguages(extra.getStringArrayList(  
          RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES));  
       } 
      }); 
     }  
     if (extra.containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)) {  
      mHandler.post(new Runnable() {   
       @Override  
       public void run() {   
        updateLanguagePreference(  
          extra.getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE));  
       } 
      }); 
     } 
    } 

    private void showToast(String text) {  
     Toast.makeText(VoiceRecognition.this, text, 1000).show(); 
    } 
} 
} 

Любая помощь приветствуется

+0

Вы не можете найти здесь код? – MByD

+0

На каком уровне вы столкнулись? Вы пробовали Инструменты Android -> Исправить свойства проекта? Указанные функции доступны только на уровне API 8. Убедитесь, что ваш проект находится на этом уровне API. – Jeshurun

+0

Я использую уровень 4 и да, я попытался исправить свойства проекта – user1255273

ответ

1

Оказывается, что проект находится на более низком уровне, чем API уровня 8. Для того, чтобы исправить это, если вы используете Eclipse, щелкните правой кнопкой мыши на проекте и выберите Свойства. Выберите Android из меню слева и выберите другую цель построения проекта. Если вы не найдете его на уровне 8 или выше, нажмите «Окно» -> Android SDK Manager и установите его. Вы можете видеть, какие функции RecognizerIntent доступны на разных уровнях API here.

+0

Спасибо! Однако все run() все еще показывают ошибки. Eclipse предполагает, что я удаляю переопределение. Должен ли я это делать или есть другое решение? Кроме того, существует ли способ использовать уровень API 8, если на телефоне находится уровень 8 или выше, и доступны ли языковые параметры или используются ниже уровня API 8, когда телефон меньше 8 и не обеспечивает выбор языка? (Извините за запуск по предложению) – user1255273

+0

см. Ссылку [this] (http://groups.google.com/group/android-qt/browse_thread/thread/fc9c3830e3582db8) для ошибок компилятора в аннотации переопределения. Да, вы можете использовать класс Build.VERSION для определения уровня во время выполнения и соответствующим образом изменить свой интерфейс. См. [This] (http://stackoverflow.com/questions/2768806/how-to-obtain-the-android-api-level-of-a-device) для получения дополнительной информации. – Jeshurun

+0

Я использую JRE 1.7. Решение составляло от 1,5 до 1,6. Я попытался перейти к 1.6, но это не сработало. Вернулся к 1.7, и он все еще не работает. – user1255273

Смежные вопросы