如何禁用Google Assist API(现在点击)

时间:2015-10-09 17:15:27

标签: android android-6.0-marshmallow google-now google-assist-api

Google最近发布了具有Now on Tap的Android Marshmallow,可以扫描应用内容并向用户提供其他信息。

不幸的是,对于我们的应用,信息看起来并不相关,Google忽略了我们在onProvideContentAssist()onProvideAssistData()内设置的数据。

These specs看起来相当高级,并且还包含像" 这样的字词可以建议"和" 其他信息"所以Google似乎正式允许自己忽略开发人员提供的数据。

所以我们决定禁用Now on Tap,但似乎不是很简单。 根据上面提供的文档,我们应该在这种情况下使用FLAG_SECURE。但是,用户无法捕获屏幕截图,Google Now on Tap开始以下面面向用户的消息来责怪我们的应用:

  

结果不可用   此应用已阻止现在点击

enter image description here

但似乎Opera在某种程度上轻轻地阻止了他们的私人标签。它为他们显示了更多app友好的消息:

  

无需点击

enter image description here

Opera如何阻止现在点击?

有没有人知道如何阻止Google Assist API(现在点击)而不会对我们的应用程序负责?

3 个答案:

答案 0 :(得分:7)

View类有一个方法setAssistBlocked

  

控制是否协助从此视图及其中收集数据   启用子项(即,是否{@link #onProvideStructure}和   将调用{@link #onProvideVirtualStructure}。默认值   是假的,允许正常的协助收集。将此设置为false   将禁用协助收集。

     

@param enabled设置为true以禁用辅助数据收集,   或者假(默认)允许它。

不幸的是,此方法使用@hide进行了注释,因此我们无法查看或直接使用它。

但我们可以通过一个小反射调用来使用它:

private void setAssistBlocked(View view, boolean blocked) {
        try {
            Method setAssistBlockedMethod = View.class.getMethod("setAssistBlocked", boolean.class);
            setAssistBlockedMethod.invoke(view, blocked);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

要阻止您可以使用的活动中的所有内容:

final View rootContent = findViewById(android.R.id.content);
setAssistBlocked(rootContent, true);

答案 1 :(得分:5)

hackbod's one comment暗示了我最终需要尝试的另一种可能的解决方案:

  

此外,在这种情况下,没有理由这样做,因为你可以使用它:https://developer.android.com/reference/android/view/View.html#dispatchProvideStructure(android.view.ViewStructure)

dispatchProvideStructure()状态的代码注释:"在层次结构中发送ViewStructure 。" (强调我的)。

因此,创建NoAssistFrameLayout的{​​{1}}子类,覆盖FrameLayout为无操作,并将其用作活动布局的根容器。这将阻止dispatchProvideStructure()自动填充活动正文中的任何内容。

但是,它不会阻止任何可以从主要内容区域之外的内容推断出的内容,例如操作栏,因为它会超出ViewStructure的视图层次结构。 可能那里不会有太多隐私影响,但它是这种技术的局限。

好的,我已经尝试过了,它确实有效:

NoAssistFrameLayout

答案 2 :(得分:-2)

Opera这样做可能是因为他们没有将浏览器更新为报告辅助数据(这需要与不使用普通视图层次结构的应用程序(如浏览器)进行特殊合作。)

但是,如果您的问题是Now on Tap没有返回相关数据,那么解决方案来阻止它获取的数据 - 所有这一切都是为了确保它为您返回的数据应用程序从未改进,因为它永远不会看到数据,它可以提供更好的建议。阻止它肯定不会导致它使用其他数据,它只会让你的应用程序变得愚蠢。

你不应该试图为你的应用程序制作Now on Tap愚蠢。