編輯:關於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);
}
}
}
}
那裡是把用戶名和密碼保存到了內存中,這一篇把用戶名和密碼保存至SharedPreferences文件。為了引起誤導,聲明實際開發中不會用到這兩種方式,這裡指示提供一種思路
第3節 TextView這是界面設計最為常用的控件,也是很多別的控件的父類,例如Button。3.1 文字常用屬性最常使用到的屬性,通過它們的名字就可以判斷出它們的作用:
昨天看了下RenderScript的官方文檔,發現RenderScript這厮有點牛逼。無意中發現ScriptIntrinsic這個抽象類,有些很有用的子類。其中有個子類
當我們看到別人的APP裡面或者寫的Demo裡面的一些很牛逼得動畫效果的時候,是否會有那麼一種沖動我要看看它的源代碼到底是怎麼寫的,為毛我就是寫不出這樣的動畫效果呢,為毛我