android開發中系統自帶語音模塊的使用

需求:項目中需要添加語音搜索模塊,增加用戶體驗
解決過程:在網上搜到語音搜索例子,參考網上代碼,加入到瞭自己的項目,完成產品要求。這個問題很好解決,網上能找到很多的資料,但是沒有直接導入工程就能用的例子,我這裡寫瞭一個完整的Demo,代碼可以直接粘貼到自己項目中去,實現瞭語音搜索,並將搜索結果展示。
語音搜索大致流程:啟動系統自帶的Intent,Intent參數設置為RecognizerIntent.ACTION_RECOGNIZE_SPEECH,再加上一些提示參數
[java]
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "請開始說話"); 

當完成語音搜索之後在onActivityResult裡進行數據接收,我這裡隻是展示瞭語音搜索的第一個結果,系統提供的結果有很多,是根據相似度排列的。我在Demo裡使用瞭handler,在handler裡把數據展示瞭出來。項目中這種情況下,對數據的一些處理都是在handler中進行。開發的過程中遇到一些語音搜索崩潰的現象,最後發現在結果展示的時候不要做一些費時的操作。
代碼如下
[java] 
public class MainActivity extends Activity { 
    private Button btnVoice; 
    private TextView tvVoiceResult; 
    private static final int VOICE_RECOGNITION_REQUEST_CODE = 123456; 
     
    private Handler jumpHandler = new Handler() { 
        public void handleMessage(android.os.Message msg) { 
            tvVoiceResult.setText((String)msg.obj); 
        }; 
    }; 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        btnVoice = (Button) findViewById(R.id.btnVoice); 
        tvVoiceResult = (TextView) findViewById(R.id.tvVoiceResult); 
        btnVoice.setOnClickListener(new OnClickListener() { 
             
            @Override 
            public void onClick(View v) { 
                try { 
                    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
                    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
                    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "請開始說話"); 
                    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
                }catch(ActivityNotFoundException e) { 
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
                    builder.setTitle("語音識別"); 
                    builder.setMessage("您的手機暫不支持語音搜索功能,點擊確定下載安裝Google語音搜索軟件。您也可以在各應用商店搜索“語音搜索”進行下載安裝。"); 
                    builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { 
                        @Override 
                        public void onClick(DialogInterface dialog, int which) { 
//                          跳轉到下載語音網頁 
                        } 
                    }); 
                    builder.setNegativeButton("取消", null); 
                    builder.show(); 
                } 
            } 
        }); 
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        getMenuInflater().inflate(R.menu.activity_main, menu); 
        return true; 
    } 
 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        super.onActivityResult(requestCode, resultCode, data); 
        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == MainActivity.RESULT_OK) { 
            ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
            if(matches.size() > 0) { 
                Message msg = new Message(); 
                msg.obj = matches.get(0); 
                jumpHandler.sendMessage(msg); 
            } 
        } 
    } 
     

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *