图片的保存与更新到媒体库
基本流程:检查/请求权限,保存到应用程序私有目录,通知媒体库更新
在调用保存图片到方法之前,先检查权限,使用
并且清单里应当有
【重写回调方法以得到授权情况】
PackageManager是一个系统级别的类,用于管理和查询Android设备上已安装的应用程序信息。通过该类提供的方法,可以获取应用程序的包名、版本号、权限信息等,并可以查询设备上已安装的应用程序列表。
是一个自定义的外存写权限的状态码,可以表示用户首次使用软件时判断到用户未授权并请求授权,使用ActivityCompat.requestPermissions()方法请求授权。这个方法需要传入一个字符串数组,表示要请求的权限列表,以及一个整数值,也就是这个状态码。
【保存图片到本地的方法】
是应用程序的私有路径。
【通知媒体库显示这张图片】
低于10的安卓版本直接就插入到媒体库了。从Android 10开始,访问外部存储设备上的文件需要使用新的API,并且需要进行特殊处理。将图片信息存放到一个ContentValues对象里,它用于在应用程序中将数据存储到数据库中或从数据库中读取数据。
具体的内容可以参考官方文档:https://developer.android.com/training/data-storage/shared/media
MediaScannerConnection.scanFile()
可以扫描指定的文件并将其添加到系统媒体库中。一般来说,当相机或录音应用程序拍照或录音时,这些文件会自动被添加到系统媒体库中。但是,如果应用程序创建了一些图片、视频或音频文件,就要使用该方法。
第一个参数是上下文(Context)对象,第二个参数是要扫描的文件路径。当调用该方法后,系统会异步地扫描指定的文件,并将其添加到系统媒体库中。可以重写onScanCompleted()
方法,该方法会在文件扫描完成后被调用。
context.getContentResolver().insert()
用于将数据插入到指定的ContentProvider中。第一个参数是Uri对象,表示要插入数据的ContentProvider的位置,即MediaStore.Images.Media.EXTERNAL_CONTENT_URI;第二个参数是ContentValues对象。
这两个API可能会结合使用。使用context.getContentResolver().insert()
方法将该图片的信息插入到系统媒体库的ContentProvider中,以便其他应用程序能够访问该图片。然后,使用MediaScannerConnection.scanFile()
方法扫描该图片,并将其添加到系统媒体库中,以确保该图片能够在相册等应用程序中显示出来。
需要注意的是,在使用MediaScannerConnection.scanFile()
方法时,不需要插入数据到ContentProvider中。该方法只是将指定的文件添加到系统媒体库中,但不会在ContentProvider中创建对应的记录。
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
用于访问外图片文件。可以通过该URI来查询、插入、更新和删除外部存储设备中的图片文件。
例如,使用ContentResolver
类的query()
方法来查询符合特定条件的图片文件,并获取它们的相关信息,如文件名、大小、日期等。还可以使用insert()
方法将新的图片文件插入到外部存储设备中,并使用update()
和delete()
方法来更新和删除已有的图片文件。
URI是Uniform Resource Identifier(统一资源标识符),用于标识和定位一个资源的字符串标识符。它可以用来唯一地标识网络上的资源、本地文件、数据库记录等等。
URL是Uniform Resource Locator(统一资源定位器),是一种特殊的URI,用于指定网络上的资源的位置。URL包含了协议、主机名、路径、查询参数等信息,可以被浏览器和其他应用程序用来获取互联网上的资源。
URI和URL的区别在于,URI只是一个标识符,用于唯一地标识一个资源,而URL则包含了更多的信息,用于定位和获取该资源。