我的目标是获得可用的 TTS 语音引擎及其各自可用的语言。我可以使用以下代码成功获取可用引擎:
PackageManager pm = getPackageManager();
Intent ttsIntent = new Intent();
ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
// ttsIntent.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
ArrayList<String> engineInfo = new ArrayList<String>();
List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent,
PackageManager.GET_META_DATA);
for (ResolveInfo appInfo : list) {
engineInfo.add(appInfo.activityInfo.applicationInfo.packageName);
engineInfo.add(appInfo.activityInfo.applicationInfo.loadLabel(pm)
.toString());
}
上面注释掉的行为意图请求额外的数据。我进行了很多搜索,但找不到queryIntentActivities()
以这种方式使用“getExtra”或“putExtra”的示例。
因此,我可以假设,这不是一个选项,我需要回去阅读一些基础知识,为什么这是不可能的!?
如果我尝试检索数据,我会得到一个空指针,即使我正在检查它!=null
是否有点奇怪?
appInfo.activityInfo.applicationInfo.metaData.getEtcEtc...
任何帮助将不胜感激,在此先感谢。
postPutEXTRA:
API 级别为 9,因此我无法使用getEngines(),尽管这将涉及为每个对象初始化一个 tts 对象,因此无论如何都不理想。
postPutEDIT:
我在循环中尝试了以下方法来提取关联的 uid,但它不适用于我测试的语音引擎之一。
ApplicationInfo ai = null;
try {
ai = pm.getApplicationInfo(appInfo.activityInfo.applicationInfo.packageName, 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
return;
}
String[] voices = pm.getPackagesForUid(ai.uid);