Google最近发布了具有Now on Tap的Android Marshmallow,可以扫描应用内容并向用户提供其他信息。
不幸的是,对于我们的应用,信息看起来并不相关,Google忽略了我们在onProvideContentAssist()
和onProvideAssistData()
内设置的数据。
These specs看起来相当高级,并且还包含像" 这样的字词可以建议"和" 其他信息"所以Google似乎正式允许自己忽略开发人员提供的数据。
所以我们决定禁用Now on Tap,但似乎不是很简单。
根据上面提供的文档,我们应该在这种情况下使用FLAG_SECURE
。但是,用户无法捕获屏幕截图,Google Now on Tap开始以下面面向用户的消息来责怪我们的应用:
结果不可用 此应用已阻止现在点击
但似乎Opera在某种程度上轻轻地阻止了他们的私人标签。它为他们显示了更多app友好的消息:
无需点击
Opera如何阻止现在点击?
有没有人知道如何阻止Google Assist API(现在点击)而不会对我们的应用程序负责?
答案 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愚蠢。