如何禁用Google Assist API(立即启动)

谷歌最近发布了Android的棉花糖与现在点击可以扫描应用程序的内容,并提供了一个额外的信息给用户。

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

这些规范看起来相当高层次,也包含像“ 可以build议 ”和“ 额外的信息 ”,所以似乎谷歌官方允许自己忽略应用程序开发人员提供的数据。

所以我们决定禁用“即时点击”,但看起来并不是很微不足道。 根据上面提供的文档,在这种情况下我们应该使用FLAG_SECURE 。 但之后用户无法捕捉屏幕截图,Tap Now上的Google即时开始用以下面向用户的消息指责我们的应用程序:

结果不可用
这个应用程序已经封锁了现在点击

在这里输入图像说明

但歌剧似乎轻轻地阻止了现在点击他们的私人标签。 它显示了更多应用程序友好的消息:

一点都没有

在这里输入图像说明

Opera如何屏蔽现在点击?

有谁知道如何阻止Google Assist API(即时点击),而不会因为我们的应用程序而被指责?

View类有一个方法setAssistBlocked :

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

启用@param设置为true将禁用辅助数据收集,或设置为false(默认)以允许。

不幸的是,这个方法是用@hide标注的,所以我们看不到或者直接使用它。

但是我们可以用一个小reflection电话来使用它:

 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); 

hackbod的一个评论暗示了另一个可能的解决scheme,我最终需要尝试一下:

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

dispatchProvideStructure()的代码注释声明:“ 在层次结构中ViewStructure发送创build”。 (强调我的)。

因此,创build一个FrameLayoutNoAssistFrameLayout子类,重写dispatchProvideStructure()作为一个no-op,并将其用作活动布局的根容器。 这将阻止ViewStructure的自动填充,以ViewStructure活动正文中的任何内容。

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


好的,我已经尝试过了,它似乎工作:

 /*** Copyright (c) 2015 CommonsWare, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. From _The Busy Coder's Guide to Android Development_ https://commonsware.com/Android */ package com.commonsware.android.assist.no; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.util.AttributeSet; import android.view.ViewStructure; import android.widget.FrameLayout; public class NoAssistFrameLayout extends FrameLayout { public NoAssistFrameLayout(Context context) { super(context); } public NoAssistFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } public NoAssistFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public NoAssistFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public void dispatchProvideStructure(ViewStructure structure) { // no, thanks } } 

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

但是,如果您的问题是“即时点播”未返回相关数据,则解决scheme不会阻止正在获取的数据 – 所做的一切就是确保您的应用程序返回的数据永远不会改进,因为它从来没有看到数据可以给出更好的build议。 阻止它肯定不会导致它使用其他数据,它只会让你的应用程序愚蠢。

你不应该试图使你的应用程序在现在的愚蠢愚蠢。