假设我正在开发一个聊天应用程序,它能够与其他人共享任何类型的文件(没有 mimetype 限制):比如图像、视频、文档,还有压缩文件,比如 zip、rar、apk 甚至不太常见的文件类型例如photoshop或autocad文件。
在 Android 9 或更低版本中,我直接将这些文件下载到下载目录,但在 Android 10 中,如果不向用户显示 Intent 以询问从何处下载它们,这是不可能的...
不可能的?但是为什么 Google Chrome 或其他浏览器能够做到这一点?事实上,他们仍然将文件下载到下载目录,而无需在 Android 10 中询问用户。
我首先分析了 Whatsapp 以了解他们如何实现它,但他们利用了 AndroidManifest 上的 requestLegacyExternalStorage 属性。但后来我分析了 Chrome,它的目标是 Android 10,而不使用 requestLegacyExternalStorage。这怎么可能?
几天来我一直在谷歌上搜索应用程序如何将文件直接下载到 Android 10 (Q) 上的下载目录,而无需询问用户将文件放在哪里,就像 Chrome 一样。
我已经阅读了 android 开发人员文档、关于 Stackoverflow 的很多问题、互联网上的博客文章和 Google Groups,但我仍然没有找到一种方法来保持与 Android 9 完全相同的方式,甚至没有一个让我满意的解决方案。
到目前为止我尝试过的:
使用 ACTION_CREATE_DOCUMENT 意图打开 SAF 以请求许可,但显然无法静默打开它。一个 Activity 总是被打开以询问用户将文件放在哪里。但是我应该在每个文件上打开这个 Intent 吗?我的应用程序可以在后台自动下载聊天文件。不是可行的解决方案。
在应用程序开头使用 SAF 获取授权访问权限,URI 指向下载内容的任何目录:
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
i = sm.getPrimaryStorageVolume().createOpenDocumentTreeIntent();
Run Code Online (Sandbox Code Playgroud)
请求用户许可是多么丑陋的活动,不是吗?即使这不是谷歌浏览器所做的。
或者再次使用 ACTION_CREATE_DOCUMENT,保存我在 onActivityResult() 中获得的 Uri 并使用 …
我有一个如下所示的自定义视图,我可以将其简化为:
class MyCustomView : FrameLayout {
constructor(context: Context) : super(context) {
initView(null)
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
initView(attrs)
}
constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int)
: super(context, attrs, defStyleAttr) {
initView(attrs)
}
private fun initView(attrs: AttributeSet?) {
attrs?.let {
context.theme.obtainStyledAttributes(attrs, R.styleable.MyCustomView, 0, 0).use {
if (it.hasValue(R.styleable.MyCustomView_my_custom_attribute)) {
//...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我收到异常:执行obtainStyledAttributes方法时 android.content.res.TypedArray 无法转换为 java.lang.AutoCloseable 。
我的项目各处都使用相同的方法,但这是唯一崩溃的地方。这是为什么?
我在使用 @ForeignKey 注释的字段更新到 Room 2.4.0-rc01 时遇到问题。此版本在其定义中添加了一个空的@Target,使其无法定位属性。
@Entity
class Foo {
@PrimaryKey
@ColumnInfo
var id: String = ""
@ForeignKey(entity = Foo::class, parentColumns = ["bar_id"], childColumns = ["bar"])
@ColumnInfo
var bar: String? = null
}
@Entity
class Bar {
@PrimaryKey
@ColumnInfo
var bar_id: String = ""
}
Run Code Online (Sandbox Code Playgroud)
我在 @ForeignKey 注释处出现以下错误:此注释不适用于目标“带有支持字段的成员属性”