Java QueryInputActivities()数据意图附加

Java QueryInputActivities()数据意图附加,java,android,text-to-speech,Java,Android,Text To Speech,我的目标是获得可用的TTS语音引擎及其各自的功能。我可以通过以下代码成功获得可用的引擎: PackageManager pm = getPackageManager(); Intent ttsIntent = new Intent(); ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); // ttsIntent.getStringArrayListExtra(TextToSpeech.

我的目标是获得可用的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());
    }
任何帮助都将不胜感激,提前谢谢

postPutEXTRA:
API级别为9,因此我无法使用,尽管这需要为每个API初始化一个tts对象,所以无论如何都不理想

推迟了:
我在循环中尝试了以下方法来提取相关的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);
然后检索ActivityResult(…)中的数据。:

activityresult上受保护的void(int-requestCode、int-resultCode、Intent-data){
如果(requestCode!=我的数据检查代码)返回;
//在这里,您应该能够从“数据”中获取信息,即。
ArrayList voices=getStringArrayListExtra(TextToSpeech.Engine.EXTRA\u AVAILABLE\u 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());
        }
    }
}
private void getEngines(){
Intent ttsinent=新Intent();
ttsinent.setAction(TextToSpeech.Engine.ACTION\u CHECK\u TTS\u数据);
ArrayList engineInfo=新的ArrayList();
PackageManager pm=getPackageManager();
List List=pm.QUERYINTENTACTIVES(TTSINT,
PackageManager.GET_META_DATA);
用于(ResolveInfo appInfo:list){
engineInfo.add(appInfo.activityInfo.applicationInfo.packageName);
ttsIntent
.setPackage(appInfo.activityInfo.applicationInfo.packageName);
ttsIntent
.getStringArrayListExtra(TextToSpeech.Engine.EXTRA可用语音);
startActivityForResult(TTsinent,33);
}
if(DE.BUG){
MyLog.d(“engineInfo:+engineInfo.size()+”:“
+engineInfo.toString());
}
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
if(requestCode==33&&data!=null){
ArrayList available=数据
.getStringArrayListExtra(“可用许可证”);
if(DE.BUG){
MyLog.i(“Voices:+available.toString());
}
}
}

我已经在我的自定义日志类/方法中留下来显示捕获数据的位置。您可以重新排列上述内容,将所有数据放入一个或多个全局数组列表。

感谢您的回复。这种意图要求用户手动选择语音引擎,但使用QueryInputActivities的目的是生成一个列表,而无需用户交互。对不起,我没说清楚…@安贾夫:啊,很抱歉没说清楚。我记得我曾尝试从ICS中移植一些新的TTS功能,以便在旧的平台上使用,但不幸的是,
getEngines()
(使用
pm.querytentservices(新的Intent(Engine.Intent\u ACTION\u TTS\u服务)、PackageManager.MATCH\u DEFAULT\u)的逻辑是关键)似乎没有在ICS前工作。。。如果你能找到一个解决办法,我会非常有兴趣听你这么说。我已经回答了我是如何做到这一点的。我不确定这是最干净的方式,但它得到了结果!
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);
}
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());
        }
    }
}