Java 获取Android';s官方语音热词检测开始工作

Java 获取Android';s官方语音热词检测开始工作,java,android,speech-recognition,voice-recognition,google-speech-api,Java,Android,Speech Recognition,Voice Recognition,Google Speech Api,注意:我在下面说我有一部安卓5.0手机,但这不正确。应该编写5.1(更具体地说,5.1.1,在OnePlus X上) 我一直在尝试在我的应用程序中安装一个热词检测器(Android的官方检测器)(借助于此:),但我在这方面遇到了一些问题。其中一个(目前我认为它是主要的)是mainteractionservice的onReady()从未被调用,我也不知道为什么 我的应用程序作为系统安装,并具有访问所有权限。另外,我在这个存储库的帮助下,正在使用内部和隐藏的Android API编译它:,这样我也可

注意:我在下面说我有一部安卓5.0手机,但这不正确。应该编写5.1(更具体地说,5.1.1,在OnePlus X上)

我一直在尝试在我的应用程序中安装一个热词检测器(Android的官方检测器)(借助于此:),但我在这方面遇到了一些问题。其中一个(目前我认为它是主要的)是
mainteractionservice的
onReady()
从未被调用,我也不知道为什么

我的应用程序作为系统安装,并具有访问所有权限。另外,我在这个存储库的帮助下,正在使用内部和隐藏的Android API编译它:,这样我也可以访问那些“秘密”东西哈哈(比如
getKeyphraseEnrollmentInfo()
方法)

一个问题可能是我在棒棒糖5.0(API 21)上尝试这个,有些东西需要API 23(棉花糖),但这只是在
MainInteractionSession
(我将在稍后讨论这一点)和
TestInteractionActivity
上进行的,我对加载它的行进行了注释(用于测试-看看我是否可以准备好()所以应该没有问题(?)。但是,当从
VoiceInteractionMain
调用
MainInteractionService
时,仍然不会调用
onReady()

如果有帮助,我还删除了名称中包含会话的两个文件。原因是
MainInteractionSession
有太多错误,我无法修复它们。我不知道该怎么做。我也可以说我是Android的初学者(或多或少-但我不太明白如何让这些东西工作)。这就是原因吗?但是我没有看到调用
MainInteractionSessionService
(调用
MainInteractionSession
——有很多错误的那个)。我看不到任何呼叫,也没有任何广播公司或其他会让系统呼叫该服务的东西

如果我能改正错误,我仍然不能在棒棒糖上吃这个,因为有些东西需要棉花糖(我认为这是在棒棒糖5上……??网址中间有“5.0.0”),但这是另一回事。我会买一部更新的手机,这样我就可以在那里测试了。但首先,我需要修复所有的东西,如果它们真的需要修复,所有这些工作

所以这里至少有两个问题:

  • 如果我似乎拥有所有权限和内容,为什么从来没有调用过
    onReady()
  • 如果有人能够修复
    MainInteractionSession
    上的错误,如果你能发布如何修复或修复的代码,那就太酷了,因为我似乎不知道如何修复它。甚至自2014年以来,
    onCreate()
    都发生了变化,这个东西需要一个来自
    onCreate()
    调用者的包,而这个函数甚至没有那个参数了。。。[修复-->更新]
PS:如果有任何帮助,我已经让语音注册应用程序开始工作()。至少我可以“注册”,但我真的不知道那有什么用。我没有错误。我只是复制粘贴了代码,所有的工作都没有改变任何东西(只是在清单中弄乱了,因为它过时了,应用程序无法启动)

EDIT:我刚刚发现最后一个API,上面写的所有API都是API 22。从API 23开始,方法的更改如上文所述。我试着使用API 21中的android.jar和隐藏/内部API来编译这个,但是这会导致资源错误,所以我可能不会麻烦-我真的不知道如何解决这个问题,我也不会使用谷歌搜索,因为我的新手机有安卓8.1,而不是棒棒糖。。。我更喜欢使用更新的API来实现这一点

更新:忘记第二个问题。刚刚修复了所有的错误。毕竟,这并不难。我所要做的就是右键单击该方法,转到声明,让它在API 22上打开。然后切换到API 29,继续Android开发人员寻找具有相同描述但名称不同的方法。在那之后,我在不禁用任何活动或服务的情况下编译了这个东西。虽然。。。仍然没有调用onReady()。如果有人知道原因,我将不胜感激——除非是因为我在吃棒棒糖,但我要到一个月后才能确定(尽管我认为这不是问题)

更新2:我想我可能已经发现了问题(或者至少是一个问题)。来自Android开发者():

  • “用户选择的当前语音交互服务始终由系统运行(…)”
  • “检查给定的服务组件是否为当前活动的VoiceInteractionService。”-来自
    isActiveService()
我从来没选过任何东西。。。!?如何选择此选项?有人知道吗?我必须编辑一些系统文件吗?也许是我在安卓设置中从未见过的设置

那是关于可访问性还是什么?也许我需要把它作为某种可访问性应用程序/服务/我需要在那里激活的东西?还是更高级的东西

编辑:正如这个答案所说(),我需要进入设置、语言和输入、语音输入,然后选择应用程序。但是,似乎什么也不做,因为仍然没有调用onReady()

更新3:回到这里有一段时间了,意识到可能有人调用了onReady(),但在另一个过程中,我不知道这一点(我现在更喜欢Android开发)。因此,假设它一直被调用(我现在看到它被调用),我现在在清单上定义的
interactior
过程中得到一些其他错误:

05-06 00:53:24.022 9322-9322/com.android.test.voiceinteraction W/KeyphraseEnrollmentInfo: com.android.test.voiceinteraction does not require MANAGE_VOICE_KEYPHRASES
05-06 00:53:24.022 9322-9322/com.android.test.voiceinteraction I/MainInteractionService: Creating com.android.test.voiceinteraction.MainInteractionService@fbadcac
05-06 00:53:24.022 9322-9322/com.android.test.voiceinteraction I/MainInteractionService: Keyphrase enrollment error? No suitable enrollment application found
05-06 00:53:24.022 9322-9322/com.android.test.voiceinteraction I/MainInteractionService: Keyphrase enrollment meta-data: null
05-06 00:53:24.022 9322-9322/com.android.test.voiceinteraction W/KeyphraseEnrollmentInfo: Enrollment application doesn't support keyphrases
05-06 00:53:24.029 9322-9322/com.android.test.voiceinteraction I/MainInteractionService: onAvailabilityChanged(-2)
05-06 00:53:24.029 9322-9322/com.android.test.voiceinteraction I/MainInteractionService: Hotword availability = -2
05-06 00:53:24.029 9322-9322/com.android.test.voiceinteraction I/MainInteractionService: STATE_HARDWARE_UNAVAILABLE
上面说我不需要MANAGE_VOICE_关键字短语,但我在清单上需要它,我使用
getPackageManager().checkPermission(“android.permission.MANAGE_VOICE_关键字短语”)进行了检查
public KeyphraseEnrollmentInfo(PackageManager pm) {
        // Find the apps that supports enrollment for hotword keyhphrases,
        // Pick a privileged app and obtain the information about the supported keyphrases
        // from its metadata.
        List<ResolveInfo> ris = pm.queryIntentActivities(
                new Intent(ACTION_MANAGE_VOICE_KEYPHRASES), PackageManager.MATCH_DEFAULT_ONLY);
        if (ris == null || ris.isEmpty()) {
            // No application capable of enrolling for voice keyphrases is present.
            mParseError = "No enrollment applications found";
            mKeyphrasePackageMap = Collections.<KeyphraseMetadata, String>emptyMap();
            mKeyphrases = null;
            return;
        }
(...)