《Android 编程权威指南》学习笔记 : 第16章 使用 intent 拍照
作者:互联网
第16章 使用 intent 拍照
方案分析
文件存储
相机拍摄的照片动辄几MB大小,保存在SQLite数据库中肯定不现实。显然,它们需要在设备文件系统的某个地方保存。
设备上就有这么一个地方:私有存储空间,像照片这样的文件也可以这么保存。
因为要处理的照片都是私有文件,只有你自己的应用能读写,
如果其他应用要读写你的文件,虽然Context.MODE_WORLD_READABLE可以传入openFileOutput(String, Int)函数,但这个flag已经废弃了。即使强制使用,在新系统设备上也不是很可靠。以前,还可以通过公共外部存储转存,但出于安全考虑,这条路在新版本系统上也被堵住了。
ContentProvider
如果想共享文件给其他应用,或是接收其他应用的文件(比如相机应用拍摄的照片),可以通过ContentProvider把要共享的文件暴露出来。
ContentProvider允许你暴露内容URI给其他应用。这样,这些应用就可以从内容URI下载或向其中写入文件。当然,主动权在你手上,你可以控制读或写。
如果只想从其他应用接收一个文件,自己实现ContentProvider简直是费力不讨好的事。
Google早已想到这点,因此提供了一个名为FileProvider的便利类。这个类能帮你搞定一切,而你只要做做参数配置就行了。
使用 FileProvider
声明FileProvider为ContentProvider,并给予一个指定的权限。在AndroidManifest.xml中添加一个FileProvider声明
代码清单: 添加FileProvider声明(manifests/AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.criminalintent">
<application .../>
<activity
.../>
...
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.criminalintent.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/files"/>
</provider>
</application>
</manifest>
其中:
- com.example.criminalintent.fileprovider:是授权字符串,后面会用到。
- exported="false": 处了自己和授权的人,其它任何人不允许使用你的 FileProvider
- android:grantUriPermissions="true":授权其它应用,允许它们向你指定位置的URI写入文件
- resource="@xml/files":指定要暴露的文件:执行一个xml资源文件。
右键点击 app/res 目录,New -> Android resource file, 资源类型选择xml,文件名输入 files,确定创建文件,替换为如下内容
代码清单: res/xm/files.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="crime_photos" path="."/>
</paths>
拍照实现
代码清单: Crime.kt
@Entity
data class Crime(...) {
val photoFileName get() = "IMG_$id.jpg"
}
代码清单:CrimeRepository.kt
class CrimeRepository private constructor(context: Context) {
...
private var filesDir = context.applicationContext.filesDir
fun getPhotoFile(crime: Crime):File = File(filesDir, crime.photoFileName)
...
}
- filesDir:返回的目录:/data/user/0/com.example.criminalintent/files
在 Device File Exploer 的位置见下图:
直接在真机的文件管理中是无法查看的,真机的操作系统已经将其隐藏,只能在 Android Studio 的 Device File Exploer 查看。
- getPhotoFile返回图片地址,比如:/data/user/0/com.example.criminalintent/files/IMG_454f516f-4812-42dc-a06a-479ceb5c359b.jpg
标签:xml,文件,16,intent,应用,Android,ContentProvider,FileProvider,files 来源: https://www.cnblogs.com/easy5weikai/p/16340182.html