以编程方式检测take_over_get_content是否为true或false。

3
似乎有些Android设备的take_over_get_content属性是true,而其他一些设备则设置为false。
从一个Android应用程序来看,是否可能检测它的值呢? 我认为直接读取是不可能的,但可以通过一些副作用(例如某些可查询的功能间接地依赖于该标志的状态)或者甚至通过模型统计来猜测(例如:如果是Pixel可能为true,如果是三星可能为false)。
供参考,可以通过ADB轻松检查:
adb shell cmd device_config get storage_native_boot take_over_get_content

背景:

  • take_over_get_content为false时,ACTION_GET_CONTENT意图是最好的选择器(允许从其他应用程序中选择图片)。
  • take_over_get_content为true时,ACTION_OPEN_DOCUMENT意图是最好的选择器(不会丢失EXIF位置信息)。

有成千上万种Android设备型号。为了制定您的"Context",您测试了多少个设备?注意:我并不是在质疑take_over_get_content的存在,而是在质疑您对于"best picker"的分析,考虑到设备制造商可能会进行许多其他更改。 - CommonsWare
有成千上万种Android设备型号。你们测试了多少款设备才得出你们的“Context”呢?注意:我并不是在质疑take_over_get_content的存在,而是在质疑你们对于“最佳选择器”的分析,因为设备制造商可能会进行很多其他的更改。 - undefined
@CommonsWare:谢谢你的评论,顺便说一下,你是我的英雄!我们收到了10多个用户关于EXIF位置丢失的报告。尽管我们还没有在成千上万台设备上进行测试,但到目前为止,我们在所有尝试过的设备上都发现这两个问题是真实存在的。如果有例外情况,我们希望能尽早听到。顺便说一下,这是关于https://github.com/commons-app/apps-android-commons/issues/5196的事情。 - Nicolas Raoul
1个回答

0

我相当确定,你没有获取该信息的方法,除非你有一个已经root过的设备,并且实际执行那个shell命令。然而,你应该能够检查MediaProvider的版本,因为该功能只适用于版本号为330811020以下的版本。

你应该能够使用PackageManager来完成这个操作,但我不能百分之百确定你是否需要额外的权限来查询设备上安装的其他应用程序:

PackageInfo packageInfo = getPackageManager().getPackageInfo("com.google.android.mediaprovider", 0);
return packageInfo.versionName;

1
感谢一个良好的开端!即使我们获得了已安装的MediaProvider版本,也不会有太大帮助。这是因为即使设备上安装了带有照片选择器的版本,所提到的功能标志仍然可能被关闭。 - kaartic
虽然这是真的,但你无法在运行时检查该标志。你唯一能做的是添加一个名为“使用传统照片选择器”的设置,然后由用户自行负责做出选择。 - user496854
1
kaartic是对的,几乎任何设备都有足够高的软件版本,真正的问题是该设备的制造商是否决定开启该功能。通常我相信大多数Pixel手机已经开启了这个功能,而大多数三星手机则关闭了这个功能,但我可能错了。 - Nicolas Raoul
@user496854 如果提供这个选项,就意味着应该有一种方法来调用传统的照片选择器(基于DocumentsUi的选择器)。然而,在相关的功能标志打开时似乎没有办法做到这一点。如果我漏掉了什么,请澄清一下。 - kaartic
@user496854 如果提供这个选项,意味着应该有一种方法来调用传统的照片选择器(基于DocumentsUi的选择器)。然而,当相关的功能标志打开时,似乎没有办法这样做。如果我漏掉了什么,请澄清一下。 - undefined
据我了解,“take_over_get_content”标志不是设备配置的硬编码,可以由谷歌在服务器端进行更改。如果我对此有误,那么没有运行ADB命令或拥有Rooted设备的方式来检查该标志。 - user496854

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接