项目需求,摇一摇打开讯飞语音的监听,
与上篇文章一起尝试的,贴代码记一下。
import android.app.Service;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
private String str = "";
private SensorManager sensorManager;
private Vibrator vibrator;
private RelativeLayout relativeLayout;
private SpeechRecognizer mIat;
private boolean isShake = false;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
relativeLayout = (RelativeLayout) findViewById(R.id.rl_shake);
tv = (TextView) findViewById(R.id.tv_show);
//1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
mIat = SpeechRecognizer.createRecognizer(this, null);
//2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
mIat.setParameter(SpeechConstant.DOMAIN, "iat");
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
vibrator=(Vibrator)getSystemService(Service.VIBRATOR_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(sensorEventListener,sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(sensorEventListener);
}
private SensorEventListener sensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
int sensorType=event.sensor.getType();
//values[0]:X轴,values[1]:Y轴,values[2]:Z轴
float[]values=event.values;
if(sensorType==Sensor.TYPE_ACCELEROMETER)
{
if (isShake){
return;
}
if((Math.abs(values[0])>25||Math.abs(values[1])>25||Math.abs(values[2])>25))
{
isShake = true;
str = "";
relativeLayout.setVisibility(View.VISIBLE);
mIat.startListening(mRecoListener);
Toast.makeText(MainActivity.this,"摇一摇",Toast.LENGTH_SHORT).show();
//摇动手机后,再伴随震动提示~~
vibrator.vibrate(500);
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
/**
* 初始化监听器。
*/
private InitListener mInitListener = new InitListener() {
@Override
public void onInit(int code) {
Log.d("Sys111", "SpeechRecognizer init() code = " + code);
if (code != ErrorCode.SUCCESS) {
Log.d("Sys111", "初始化失败,错误码: code = " + code);
}
}
};
//3.开始听写 mIat.startListening(mRecoListener);
//听写监听器
//听写结果回调接口(返回Json格式结果,用户可参见附录12.1);
//一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
//关于解析Json的代码可参见MscDemo中JsonParser类;
private RecognizerListener mRecoListener = new RecognizerListener() {
@Override
public void onVolumeChanged(int i, byte[] bytes) {
}
@Override
public void onBeginOfSpeech() {
Log.d("Sys111", " onBeginOfSpeech + 开始说话");
}
@Override
public void onEndOfSpeech() {
Log.d("Sys111", " onEndOfSpeech + 结束说话");
relativeLayout.setVisibility(View.INVISIBLE);
isShake = false;
}
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
try {
JSONObject jsonObject = new JSONObject(recognizerResult.getResultString());
JSONArray jsonArray = jsonObject.getJSONArray("ws");
for (int i = 0 ; i < jsonArray.length() ; i ++){
JSONObject json = (JSONObject) jsonArray.get(i);
JSONArray jsonArrayCw = json.getJSONArray("cw");
str += ((JSONObject)jsonArrayCw.get(0)).getString("w");
}
Log.i("Sys111", "onResult: = " + str);
Log.i("Sys111", "onResult: = " + recognizerResult.getResultString());
tv.setText(str);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(SpeechError speechError) {
}
@Override
public void onEvent(int i, int i1, int i2, Bundle bundle) {
}
};
}