Android多媒体功能开发(2)——FileProvider

这篇具有很好参考价值的文章主要介绍了Android多媒体功能开发(2)——FileProvider。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用系统多媒体界面需要在我们的应用和其他应用之间通过Intent传递音频、图片、视频文件的信息。随着Android版本的升级,对应用数据安全性方面的限制越来越多。

Android 6以后不允许应用在外部存储随便创建目录,只能在Android规定的应用自己的文件目录下创建目录,该目录可以用方法getExternalFilesDir(null)来获得,其实际位置为:

        Android/data/<package-name>/files/

Android 7以前的版本可以直接使用“file://”格式的uri在应用之间传递文件信息,格式为:

        file:// + <路径> + <文件>

例如:file:///storage/emulated/0/Android/data/com.zzk.a1501systemactivity/files/test/audio.acc

Android 7及更高版本使用了更严格的文件分享模式,禁止开发人员在应用外部以 “file://”格式的uri分享应用自己目录下的文件,否则会出现 FileUriExposedException 异常。如果需要向其他应用公开应用自己目录下的文件,需要使用FileProvider。

FileProvider是ContentProvider的一种,格式为:

        content:// + <FileProvider名>+<路径别名>+<文件>

由于采用别名代替了实际路径,避免了直接暴露文件位置,所以更加安全。例如:

        content://com.zzk.a1501systemactivity.fileProvider/testdir/audio.aac

使用FileProvider向其他应用传递文件需要以下步骤:

  1. 声明FileProvider
  2. 编写一个xml文件,列出共享目录和别名
  3. 生成Content URI
  4. 授予对方应用访问权限
  5. 提供Content URI给其他应用

下面我们具体解释一下这几个步骤。

FileProvider需要在应用配置文件AndroidManifest中声明,和ContentProvider的声明类似。例如: 

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


声明中name属性为FileProvider对应的Java类(androidx.core.content.FileProvider),已经在Android库中存在,不用自己编写。authories一般采用应用包名+“.fileProvider”保证唯一性。meta-data中的FILE_PROVIDER_PATHS指定一个名为file_paths.xml的文件,在该文件中声明要传递的文件所在路径的别名。这个xml文件位于res/xml/目录下,内容类似于:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path
        name="testdir"
        path="test"/>
</paths>

这里声明了一个testdir,实际对应的路径为external-files-path代表的 /Android/data/com.zzk.a1501systemactivity/files/ 路径下的test目录。

除了<external-files-path>标签外,还可以使用下面的标签:

  • <root-path>: 设备根目录/
  • <files-path>: context.getFilesDir()的目录
  • <cache-path>:context.getCacheDir()的目录
  • <external-path>:Environment.getExternalStorageDirectory()的目录
  • <external-files-path>:ContextCompat.getExternalFilesDirs()下标为0的目录
  • <external-cache-path>:ContextCompat.getExternalCacheDirs()下标为0的目录
  • <external-media-path>:context.getExternalMediaDirs()下标为0的目录

接下来是生成Content URI,需要使用 FileProvider 类提供的公有静态方法 getUriForFile 生成 Content URI。比如:

Uri uri = FileProvider.getUriForFile(MainActivity.this, fileProviderAuthority, audioFile);

getUriForFile方法的第一个参数是上下文;第二个参数是FileProvider的authorities,需要和配置文件中声明FileProvider时给出的定义(android:authorities="${applicationId}.fileProvider")相同,一般采用“<应用包名>.fileProvider”以保证唯一性。第三个参数是要传递的文件。

接下来就可以把该uri放到Intent中,再授予对方读/写权限,就可以传递给其他应用使用了。示例代码如下:文章来源地址https://www.toymoban.com/news/detail-620414.html

Intent intent = new Intent(Intent.ACTION_VIEW);     //  创建intent
intent.setDataAndType(uri, "audio/*");     //  把文件的Content URI放入intent
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //  授予对方读取文件的权限
startActivity(intent);  //  传递给其他应用

到了这里,关于Android多媒体功能开发(2)——FileProvider的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS学习路之开发篇—多媒体开发(相机开发 二)

    Camera操作类,包括相机预览、录像、拍照等功能接口。 接口名 描述 triggerSingleCapture​(FrameConfig frameConfig) 启动相机帧的单帧捕获。 triggerMultiCapture​(ListFrameConfig frameConfigs) 启动相机帧的多帧捕获。 configure​(CameraConfig config) 配置相机。 flushCaptures​() 停止并清除相机帧的捕获

    2024年02月11日
    浏览(30)
  • HarmonyOS学习路之开发篇—多媒体开发(相机开发 一)

    HarmonyOS相机模块支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发,最常见的操作如:预览、拍照、连拍和录像等。 相机静态能力 用于描述相机的固有能力的一系列参数,比如朝向、支持的分辨率等信息。 物理相机 物理相机就是独

    2024年02月10日
    浏览(43)
  • HarmonyOS学习路之开发篇—多媒体开发(图像开发 二)

    图像编码就是将PixelMap图像编码成不同存档格式图片,用于后续其他处理,比如保存、传输等。当前仅支持JPEG格式。 ImagePacker主要用于图像编码。 接口名 描述 create() 创建图像打包器实例。 initializePacking(byte[] data, PackingOptions opts) 初始化打包任务,将字节数组设置为打包后输

    2024年02月11日
    浏览(26)
  • HarmonyOS学习路之开发篇—多媒体开发(图像开发 一)

    HarmonyOS图像模块支持图像业务的开发,常见功能如图像解码、图像编码、基本的位图操作、图像编辑等。当然,也支持通过接口组合来实现更复杂的图像处理逻辑。 图像解码 图像解码就是不同的存档格式图片(如JPEG、PNG等)解码为无压缩的位图格式,以方便在应用或者系统

    2024年02月11日
    浏览(26)
  • Ubuntu 多媒体播放器——KMPlayer Linux:功能强大的视频播放工具

    KMPlayer Linux是一款功能强大的多媒体播放器,专为Ubuntu操作系统设计。它提供了丰富的功能和用户友好的界面,使得在Ubuntu上观看视频变得更加方便和愉快。本文将介绍KMPlayer Linux的安装过程,并提供一些示例代码来演示其功能。 安装KMPlayer Linux 要安装KMPlayer Linux,请按照以下

    2024年02月04日
    浏览(49)
  • qt6 多媒体开发代码分析(二、录音)

    常见的音频编码格式包括MP3、AAC、OGG、WMA、FLAC等,它们之间具有以下区别: 编码方式不同:这些编码格式采用的编码算法不同,例如MP3和AAC使用有损压缩算法,而FLAC使用无损压缩算法。 压缩率和文件大小不同:由于采用的编码算法不同,不同格式的音频文件压缩率和文件大

    2024年02月07日
    浏览(22)
  • HarmonyOS学习路之开发篇—多媒体开发(音频开发 二(1)

    接口说明 接口名 描述 AudioCapturer(AudioCapturerInfo audioCapturerInfo) throws IllegalArgumentException 构造函数,设置录音相关音频参数,使用默认录音设备。 AudioCapturer(AudioCapturerInfo audioCapturerInfo, AudioDeviceDescriptor devInfo) throws IllegalArgumentException 构造函数,设置录音相关音频参数并指定录音

    2024年04月23日
    浏览(28)
  • SDL库入门:掌握跨平台游戏开发和多媒体编程

    SDL (Simple DirectMedia Layer) 是一个跨平台的开源多媒体库,它提供了访问音频、键盘、鼠标、操纵杆以及图形硬件的底层接口。SDL 可用于开发游戏、仿真器、媒体播放器等多种类型的应用程序。 1.1 SDL 的背景与应用领域 SDL 由 Sam Lantinga 开发,最早发布于 1998 年。SDL 的设计目标是

    2024年02月02日
    浏览(32)
  • [任务书+论文+PPT+源码]基于Android与多媒体的英文学习APP的设计与实现

    第1页 毕业设计(论文)题目:基于ANDROID与多媒体技术的英文学习APP的设计与实现设计(论文)要求及原始数据(资料):1.综述国内外移动互联现状及前景;2.了解ANDROID系统,理解ANDROID应用程序的开发方法和步骤;3.分析该ANDROID应用程序的模块结构和主要算法;4.熟悉

    2024年01月22日
    浏览(80)
  • 15-1_Qt 5.9 C++开发指南_Qt多媒体模块概述

    多媒体功能指的主要是计算机的音频和视频的输入、输出、显示和播放等功能,Qt 的多媒体模块为音频和视频播放、录音、摄像头拍照和录像等提供支持,甚至还提供数字收音机的支持。本章将介绍 Qt 多媒体模块的功能和使用。 Qt 多媒体模块提供了很多类,可以实现如下的

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包