Android 四大组件 内容提供器
内容提供程序有助于应用管理其自身和其他应用所存储数据的访问,并提供与其他应用共享数据的方法。它们会封装数据,并提供用于定义数据安全性的机制。内容提供程序是一种标准接口,可将一个进程中的数据与另一个进程中运行的代码进行连。实现内容提供程序大有好处。最重要的是,通过配置内容提供程序,您可以使其他应用安全地访问和修改您的应用数据
内容提供程序的优点
内容提供程序可精细控制数据访问权限。您可以选择仅在应用内限制对内容提供程序的访问,授予访问其他应用数据的权限,或配置读取和写入数据的不同权限。如需了解有关安全使用内容提供程序的更多信息,请参阅存储数据的安全提示与内容提供程序权限。
您可以使用内容提供程序将细节抽象化,以用于访问应用中的不同数据源。例如,您的应用可能会在 SQLite 数据库中存储结构化记录,以及视频和音频文件。如果您在应用中实现此开发模式,则可使用内容提供程序访问所有这类数据。
内容提供程序基础知识
https://developer.android.google.cn/guide/topics/providers/content-provider-basics?hl=zh-cn
通常,您会在以下两种场景中使用内容提供程序:一种是通过实现代码访问其他应用中的现有内容提供程序;另一种是在应用中创建新的内容提供程序,从而与其他应用共享数据。本主题介绍使用现有内容提供程序的基础知识。如需详细了解如何在自己的应用中实现内容提供程序,请参阅创建内容提供程序。
FileProvider
android/data/{PACKAGENAME}是安卓应用在设备存储中的一个重要目录。{PACKAGENAME}是应用的包名,这是一个唯一标识应用的字符串。这个目录主要用于存储应用相关的数据,并且它的存在使得每个应用的数据相对独立,避免不同应用之间的数据相互干扰。
FileProvider 是 Android 系统提供的一个内容提供器(Content Provider),用于在应用之间或者应用内部的不同组件之间安全地共享文件。它继承自androidx.core.content.FileProvider(在 AndroidX 库中)或者android.support.v4.content.FileProvider(在旧的支持库中)。
在 Android 7.0(API 级别 24)及以上版本,出于安全考虑,系统禁止在没有适当权限设置的情况下使用file://形式的 URI(统一资源标识符)来共享文件。因为这种方式可能会导致其他应用获取到文件的真实路径,从而产生安全风险,如访问其他应用的私有文件等。FileProvider 就是为了解决这个问题而引入的。
AndroidManifest.xml
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:networkSecurityConfig="@xml/network_security_config"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:roundIcon="@drawable/logo"
android:supportsRtl="true"
android:theme="@style/Theme.njzj"
tools:targetApi="31">
...........
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>xml/file_paths.xml
<paths>
<external-files-path name="static" path="./static/" />
</paths>- external-files-path 标签表示映射应用的内部
files目录,name属性可以看作是这个路径的别名,path属性指定相对路径。 例如文件:android/data/cn.simae.tny.njzj/files/static/map/CoALA.png代码
val contentUri = FileProvider.getUriForFile(context, "cn.simae.tny.njzj.fileprovider", imageFile)
生成的对外连接则是: content://cn.simae.tny.njzj.fileprovider/static/map/CoALA.png