2013-04-08 64 views
1

我尝试写的Android应用程序,需要从谷歌语音API返回的字符串,并用它来发送到其他对象“levenshte.testLevenshteindistance”代码,相同的内线。如何成为保证谷歌语音API返回值 - java的

的问题,我不能让它成为同步的工作! 我的意思是我的代码调用谷歌语音API返回值之前对象“依赖于互联网的速度”?

ublic class MainActivity extends Activity { 


public ListView sList; 
ArrayList<String> names; 
int sfound; 
mp3Player mp3Player;  
Levenshteindistance levenshte; 

public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    voiceinputbuttons(); 
    starVoiceRecognation(); 
} 


private void starVoiceRecognation() { 
     Thread timer = new Thread(){   
     public void run(){ 
       new VoiceRecognizer().execute(); 

      //names is an ArrayList returnd by google speech api 

       sfound=levenshte.testLevenshteindistance(names.get(0).toString()); 

     } 
     };timer.start(); 
} 


public void voiceinputbuttons() { 
    sList = (ListView) findViewById(R.id.list); 
    //default value if create mp3player before set sName or rName or actionNumbe 
    names=null; 
    levenshte = new Levenshteindistance(); 

} 


public void informationMenu() { 
    startActivity(new Intent("android.intent.action.INFOSCREEN")); 
    } 


public void startVoiceRecognitionActivity() { 

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Speech recognition demo"); 
    try { 
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
    } catch (ActivityNotFoundException e) { 
    } 

} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { 

     // i want the timer thread wait until assign a value to this name variable 

     names = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
      if (names.contains("information")) { 
       informationMenu(); 
      } 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

private class VoiceRecognizer extends AsyncTask<String, Integer, String> { 
@Override 
    protected String doInBackground(String... url1) { 

     startVoiceRecognitionActivity(); 

     return null; 
     } 

} 


} 

我想肯定的是,名称不为空调用levenshte.testLevenshteindistance时(names.get(0)的ToString());

回答

2

你设置错了这一点。您不会在任务中启动语音识别,并假设在某个计时器运行时它会结束。语音识别需要时间,当它完成时,它会回调onActivityResult。你应该在那里开始你的新活动。

此外,语音识别活动可能在错误返回null。无论如何,我会做一个空检查,只是为了确保。

+0

对不起,我需要更多的解释! – Arwa 2013-04-09 14:32:48

+0

我可以如何使它在doInBackground函数内? – Arwa 2013-04-19 19:14:47

+0

你没有。语音识别由另一个应用程序处理。 YOu调用startActivity来启动它,当它完成时它会调用onActivityResult。 – 2013-04-19 20:13:34