[英]queryIntentActivities() data Intent extras
我的目标是获得可用的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());
}
上面的注释行要求额外的意图数据。 我已经进行了许多搜索,但是找不到以这种方式使用'getExtra'或'putExtra'的queryIntentActivities()
示例。
因此,我可以假定这不是一个选择,我需要回过头来阅读一些无法实现的基本知识!
如果我尝试检索数据,即使我正在检查它是否为!=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);
我已经经历了类似的过程,但是如果我没记错的话,就不能简单地触发意图查询来获取可用的语言。 这绝对是有道理的,因为可用的语言取决于用户将使用TTS引擎安装的声音和其他软件包。 换句话说:它不是您要查询的某些静态参数,而是需要在运行时解析。
为了获得TTS引擎可用的声音(和其他信息),您需要实际启动/初始化它。 这意味着您需要执行以下操作:
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
然后在onActivityResult(...)
检索数据:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != MY_DATA_CHECK_CODE) return;
// here you should be able to get the info from 'data', i.e.
ArrayList<String> voices = getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
}
请注意,我从Android开发博客上的一篇文章中复制粘贴了上面的大部分内容 。
自从我上次使用TTS以来已经有一段时间了,因此,如果上述工作不可行,请随时发表评论,我将仔细研究一下当时的实现。
我无法解决此问题的特定标题,但是通过以下方式,我确实在设备上获得了我想要的有关可用语音引擎及其语言的信息,而无需用户交互:
private void getEngines() {
Intent ttsIntent = new Intent();
ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
ArrayList<String> engineInfo = new ArrayList<String>();
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent,
PackageManager.GET_META_DATA);
for (ResolveInfo appInfo : list) {
engineInfo.add(appInfo.activityInfo.applicationInfo.packageName);
ttsIntent
.setPackage(appInfo.activityInfo.applicationInfo.packageName);
ttsIntent
.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
startActivityForResult(ttsIntent, 33);
}
if (DE.BUG) {
MyLog.d("engineInfo: " + engineInfo.size() + " : "
+ engineInfo.toString());
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 33 && data != null) {
ArrayList<String> available = data
.getStringArrayListExtra("availableVoices");
if (DE.BUG) {
MyLog.i("Voices: " + available.toString());
}
}
}
我已经离开了自定义的日志记录类/方法,以显示要在哪里捕获数据。 您可以重新排列以上内容,以将所有数据放入一个或多个全局数组列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.