2013-07-28 59 views
2

在我的應用(Android API 10)我用標準的方法來檢查,如果TTS引擎和語音可供選擇:Android的TTS - ACTION_CHECK_TTS_DATA默認引擎

Intent checkIntent = new Intent(); 
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
startActivityForResult(checkIntent, CHECK_TTS_DATA); 

在裝置至一TTS引擎的Android更請求選擇一個(「使用完整動作...」)

有沒有辦法使用默認的TTS引擎檢查ACTION_CHECK_TTS_DATA(以避免引擎選擇對話框)? 或...我如何獲得用戶選擇的TTS引擎(與setEngineByPackageName()(API 10)一起使用它)?

+0

你有問題的任何解決方案,因爲我有同樣的問題。 –

回答

2

有幾種方法可以做到這一點。爲了獲取默認TTS引擎,檢查在OnInit聽衆:

TextToSpeech tts = new TextToSpeech(context, onInitListener); 


    @Override 
     public void onInit(final int status) { 

      switch (status) { 

      case TextToSpeech.SUCCESS: 

       try { 

        final String initEngine = tts.getDefaultEngine(); 

    // Check it's != null before doing anything with it. 

       } catch (final Exception e) { 

       } 

     break; 
    } 
} 

的try/catch塊是那裏我有一些IVONA和SVOX TTS引擎崩潰。

一旦你有包名稱,你就可以查詢意圖活動,並在必要時使用自定義選擇器或將意圖限制爲你從上面得到的包名稱。

private void getEngines(String initEngine) { 

     Intent ttsIntent = new Intent(); 
     ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 

     PackageManager pm = getPackageManager(); 

     List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent, 
       PackageManager.GET_META_DATA); 

     for (ResolveInfo appInfo : list) { 

// Might want a null check in here 

      if(appInfo.activityInfo.applicationInfo.packageName.matches(initEngine) { 

      ttsIntent 
        .setPackage(appInfo.activityInfo.applicationInfo.packageName); 
     } 


      startActivityForResult(ttsIntent, 33); 

     } 
    } 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == 33 && data != null) { 

     // do something 
    } 
} 

我沒有測試以上,但我敢肯定,你可以建立它來得到它做你想要的。