@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.setlock); recorder = Recorder.getInstance(); vf = (ViewFlipper) findViewById(R.id.viewFlipper); firstView = vf.findViewById(R.id.first); secondView = vf.findViewById(R.id.second); thirdView = vf.findViewById(R.id.third); forthView = vf.findViewById(R.id.forth); Button btn_speak1 = (Button) firstView.findViewById(R.id.btn_speak); Button btn_speak2 = (Button) thirdView.findViewById(R.id.btn_speak); Button btn_cancel1 = (Button) firstView.findViewById(R.id.btn_cancel); Button btn_cancel2 = (Button) secondView.findViewById(R.id.btn_cancel2); Button btn_cancel3 = (Button) thirdView.findViewById(R.id.btn_cancel); Button btn_confirm = (Button) forthView.findViewById(R.id.btn_confirm); Button btn_next = (Button) secondView.findViewById(R.id.btn_next); Button btn_unlock = (Button) forthView.findViewById(R.id.btn_unlock); btn_cancel1.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btn_cancel2.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btn_cancel3.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btn_confirm.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btn_next.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { vf.showNext(); } }); btn_unlock.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(SetlockActivity.this, UnlockActivity.class); startActivity(intent); } }); btn_speak1.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { AlertDialog.Builder adBuilder = new AlertDialog.Builder(SetlockActivity.this); adBuilder .setMessage(R.string.recording) .setCancelable(false) .setPositiveButton( R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog = adBuilder.create(); alertDialog.show(); // 显示对话框 alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false); recorder.start(); // 开始录音 } else if (event.getAction() == MotionEvent.ACTION_UP) { recorder.stop(); String strProcessing = getString(R.string.processing); alertDialog.setMessage(strProcessing); try { firstMfcc = DataProcess.getMfcc(recorder.getNormalizedData()); } catch (Exception e) { Log.e("getMfcc", "error"); } if (firstMfcc == null) { String strNoSpeech = getString(R.string.no_speech); alertDialog.setMessage(strNoSpeech); alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true); } else { alertDialog.cancel(); vf.showNext(); } } return false; } }); btn_speak2.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { AlertDialog.Builder adBuilder = new AlertDialog.Builder(SetlockActivity.this); adBuilder .setMessage(R.string.recording) .setCancelable(false) .setPositiveButton( R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog = adBuilder.create(); alertDialog.show(); // 显示对话框 alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false); recorder.start(); // 开始录音 } else if (event.getAction() == MotionEvent.ACTION_UP) { recorder.stop(); String strProcessing = getString(R.string.processing); alertDialog.setMessage(strProcessing); try { secondMfcc = DataProcess.getMfcc(recorder.getNormalizedData()); } catch (Exception e) { e.printStackTrace(); } if (secondMfcc == null) { String strNoSpeech = getString(R.string.no_speech); alertDialog.setMessage(strNoSpeech); alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true); } else { double dtwDis; try { dtwDis = DataProcess.getDTW(firstMfcc, secondMfcc); double meanErr = dtwDis * 2 / (secondMfcc.length + firstMfcc.length); // alertDialog.setMessage("dtw误差:" + dtwDis + '\n' // + "帧数1:" + firstMfcc.length + '\n' // + "帧数2:" + secondMfcc.length + '\n' // + "平均误差:" + mean); // // alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true); if (meanErr > 40) { // 阀值设的40 String strReRecord = getString(R.string.not_the_same); alertDialog.setMessage(strReRecord); alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true); } else { executor.execute(new writeDataTask("firstMfcc.dat", firstMfcc)); // 保存声音锁的mfcc数据 executor.execute(new writeDataTask("secondMfcc.dat", secondMfcc)); latch.await(); alertDialog.cancel(); vf.showNext(); } } catch (InterruptedException e) { e.printStackTrace(); } } } return false; } }); }