编程语言
首页 > 编程语言> > 《Android 编程权威指南》学习笔记 : 第16章 使用 intent 拍照

《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>

其中:

右键点击 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)
     ...
}

直接在真机的文件管理中是无法查看的,真机的操作系统已经将其隐藏,只能在 Android Studio 的 Device File Exploer 查看。

标签:xml,文件,16,intent,应用,Android,ContentProvider,FileProvider,files
来源: https://www.cnblogs.com/easy5weikai/p/16340182.html