Android开发笔记(一百七十六)借助FileProvider发送彩信
Posted aqi00
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发笔记(一百七十六)借助FileProvider发送彩信相关的知识,希望对你有一定的参考价值。
通过系统相册固然可以获得照片的路径对象,却无法知晓更多的详细信息,例如图片名称、文件大小、文件路径等等都不知道,也就无法进行个性化的定制开发。为了把更多的文件信息开放出来,android设计了专门的媒体共享库,允许开发者通过内容组件从中获取更详细的媒体信息。
就图片而言,相册媒体库的路径为MediaStore.Images.Media.EXTERNAL_CONTENT_URI,于是通过内容解析器即可从媒体库依次遍历得到图片列表详情。为便于代码管理,首先要声明如下的对象变量:
private List<ImageInfo> mImageList = new ArrayList<ImageInfo>(); // 图片列表
private Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; // 相册的Uri
private String[] mImageColumn = new String[]{ // 媒体库的字段名称数组
MediaStore.Images.Media._ID, // 编号
MediaStore.Images.Media.TITLE, // 标题
MediaStore.Images.Media.SIZE, // 文件大小
MediaStore.Images.Media.DATA}; // 文件路径
然后根据内容解析器查询媒体库的图片信息,简单起见只挑选文件大小最小的前六张图片,列表加载代码示例如下:
// 加载图片列表
private void loadImageList() {
mImageList.clear(); // 清空图片列表
// 通过内容解析器查询系统的相册,并返回结果集的游标。“_size asc”表示按照文件大小升序排列
Cursor cursor = getContentResolver().query(mImageUri, mImageColumn, null, null, "_size asc");
if (cursor != null) {
// 下面遍历结果集,并逐个添加到图片列表。简单起见只挑选前六张图片
for (int i=0; i<6 && cursor.moveToNext(); i++) {
ImageInfo image = new ImageInfo(); // 创建一个图片信息对象
image.setId(cursor.getLong(0)); // 设置图片编号
image.setName(cursor.getString(1)); // 设置图片名称
image.setSize(cursor.getLong(2)); // 设置图片的文件大小
image.setPath(cursor.getString(3)); // 设置图片的文件路径
mImageList.add(image); // 添加至图片列表
}
cursor.close(); // 关闭数据库游标
}
}
注意到以上代码获得了字符串格式的文件路径,而彩信发送应用却要求Uri类型的路径对象,原本可以通过代码“Uri.parse(path)”将字符串转换为Uri对象,但是从Android7.0开始,系统不允许其他应用直接访问老格式的路径,必须使用文件提供器FileProvider才能获取合法的Uri路径,相当于A应用申明共享某个文件,然后B应用方可访问该共享文件。为此需要重头配置FileProvider,详细的配置步骤说明如下。
首先在res目录新建xml文件夹,并在该文件夹中创建file_paths.xml,再往xml文件填入以下内容,表示定义几个外部文件目录:
<paths>
<external-path path="Android/data/com.example.chapter07/" name="files_root" />
<external-path path="." name="external_storage_root" />
</paths>
接着打开AndroidManifest.xml,在application节点末尾添加下面的provider标签,用于声明当前应用的提供器组件,添加的标签配置示例如下:
<!-- 兼容Android7.0,把访问文件的Uri方式改为FileProvider -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.chapter07.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
上面的provider有两处地方是可变的,一处是authorities属性,它规定了授权字符串,这是每个提供器的唯一标识;另一处是元数据的resource属性,它指明了文件提供器的路径资源,也就是刚才定义的file_paths.xml。
回到页面的活动源码,在发送彩信之前添加下述代码,目的是根据字符串路径构建Uri对象,注意针对Android7.0以上的兼容处理。
Uri uri = Uri.parse(path); // 根据指定路径创建一个Uri对象
// 兼容Android7.0,把访问文件的Uri方式改为FileProvider
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// 通过FileProvider获得文件的Uri访问方式
uri = FileProvider.getUriForFile(this,
BuildConfig.APPLICATION_ID + ".fileProvider", new File(path));
}
由以上代码可见,Android7.0开始调用FileProvider的getUriForFile方法获得Uri对象,该方法的第二个参数为文件提供器的授权字符串(BuildConfig.APPLICATION_ID值为当前应用的包名),第三个参数为File类型的文件对象。
之后运行App,测试页面会自动加载从媒体库中找到的六张图片,填好各项信息的界面效果如下图所示。
最后点击某张图片,表示选中该图片作为彩信附件,界面下方弹出如下图所示的应用选择窗口。
选中信息图标再点击仅此一次按钮,即可跳到如下图所示的系统彩信发送页面了。
以上是关于Android开发笔记(一百七十六)借助FileProvider发送彩信的主要内容,如果未能解决你的问题,请参考以下文章
Android开发笔记(一百七十六)借助FileProvider发送彩信
Android开发笔记(一百七十七)借助FileProvider安装应用
Android开发笔记(一百七十七)借助FileProvider安装应用
Android开发笔记(一百七十七)借助FileProvider安装应用