识别器Intent无法定义其常量

时间:2012-05-07 16:07:50

标签: android voice-recognition

我正在使用Google提供的活动voicerecognition.java,允许用户选择语言,与手机通话,并查看他们刚刚说过的内容。它在我取出所有语言常量时起作用,但当我把语言选项放入时,我会收到错误。 例如:

  • 方法getVoiceDetailsIntent(VoiceRecognition)未定义类型
  • EXTRA_SUPPORTED_LANGUAGES无法解析或不是字段
  • EXTRA_LANGUAGE_PREFERENCE无法解析或不是字段
  • new Runnable(){}类型的run()方法必须覆盖超类方法

我想我可能只需更新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();   
    }
}
}

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您的项目似乎处于比级别8更低的API级别。要解决此问题,如果您使用的是Eclipse,请右键单击您的项目并单击属性。从左侧菜单中选择Android,然后选择其他项目构建目标。如果您没有在8级或更高级别找到,请单击Window - &gt; Android SDK Manager并安装一个。您可以在各种API级别here看到RecognizerIntent的哪些功能可用。