我怎么知道我的应用程序是由 Google 助手打开的,而不是正常启动的

How can I know that my app was opened by Google Assistant, instead of just normally launched

我怎么知道我的应用程序是由 Google 助手打开的,而不是正常启动的。 我不需要应用操作。我只是想知道,是的,我的应用程序是用 "Ok Google -> Open appname" 打开的,而不是按图标,或者从最近的图标中恢复它。 我可以检查捆绑包中是否有 intent/any 数据?

这是我的意图"Open appname"

Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.xelion.android cmp=com.xelion.android/.activity.InitializationActivity (has extras) }

它还有额外功能,但不知道是什么:

Bundle[mParcelledData.dataSize=220]

编辑:

我发现这将是用 google 助手打开的标志:

intent.flags == 0x10000000

但我的问题是,当我从机器构建应用程序或更新它时,这也会 运行,知道如何避免这种情况吗?

编辑 2:

我也试过:

private fun getReferrerCompatible(activity: Activity): Uri? {
    val intent = activity.intent
    val referrerUri: Uri? = intent.getParcelableExtra(Intent.EXTRA_REFERRER)
    if (referrerUri != null) {
        return referrerUri
    }
    val referrer = intent.getStringExtra(REFERRER_NAME)
    if (referrer != null) {
        // Try parsing the referrer URL; if it's invalid, return null
        try {
            return Uri.parse(referrer)
        } catch (e: ParseException) {
            return null
        }

    }
    return null
}

但我仍然得到 NULL 作为 referrer

我正在尝试:来自 onCreate 的 intent.extras?.get(KEY_REF_NAME) == REG_G_ASSISTANTgetReferrerCompatible()。应该晚点吗?喜欢 onResume?

当通过 Google 助手打开时,android.intent.extra.REFERRER_NAME 将是 android-app://com.google.android.googlequicksearchbox/https/www.google.com

val KEY_REF_NAME = "android.intent.extra.REFERRER_NAME"
val REG_G_ASSISTANT = "android-app://com.google.android.googlequicksearchbox/https/www.google.com"

if (intent.extras?.get(KEY_REF_NAME) == REG_G_ASSISTANT) {
    // APP OPENED THROUGH GOOGLE ASSISTANT
} else {
    // APP OPENED THROUGH DEFAULT LAUNCHER
}

根据 theapache64 给出的响应和这个 link: https://github.com/allegro/slinger/blob/master/slinger/src/main/java/pl/allegro/android/slinger/ReferrerMangler.java

因为意图是在 Android 10 上返回 null,并且由于我的最小 SDK 是 23(我不需要在 M 下实现逻辑),所以我完成了以下代码:

  val REG_G_ASSISTANT = "com.google.android.googlequicksearchbox"
  if (referrer != null && referrer.toString().contains(REG_G_ASSISTANT)) {
      //code to do
  }

这是 Kotlin,并且在 activity 中。 .java 中 referrer 的等价物是:

activity.getReferrer(); 

如果您 运行 和 OS 未满 23 岁,可以这样取推荐人:

val KEY_REF_NAME = "android.intent.extra.REFERRER_NAME"
intent.extras?.get(KEY_REF_NAME)

由于 theapache64 在 OnePlus6 上进行了尝试,我认为这应该可以在某些设备上运行到 API 级别 28 (Pie)。但可以肯定的是,我建议使用 activity.getReferrer()