前言
原先有适配过,但是当时就copy能用就行了。最近在写轮子工具,就再次查了下资料,就顺便整个都了解一下,记录下来。
适配7.0(既调用FileProvider)
- 创建provider数据
就是在清单文件manifest.xml中的application
节点下面添加如下配置
<manifest>
...
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="你的包名.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" /> <!--7.0配置文件路径 我放在了xml下的file_paths中-->
</provider>
...
</application>
</manifest>
参数 | 说明 |
---|---|
android:name | 你可以使用v4包提供的FileProvider或者自定义的只需要在name申明就好了,一般使用系统的就足够了。 |
android:authorities | 类似schema,命名空间之类。 |
android:exported | false表示我们的provider不需要对外开放。 |
android:grantUriPermissions | 申明为true,你才能获取临时共享权限。 |
- 在res中创建配置文件
按上面的名字我们需要创建一个file_paths路径文件
代码如下
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="app" path="/" />
<files-path name="app" path="/" />
<cache-path name="app" path="/" />
<external-cache-path name="app" path="/" />
<external-files-path name="app" path="/" />
</paths>
以上name是代表生成的新uri的时候的拼接名称,path代表前面参数路径后拼接的内容
具体说明如下
参数 | 说明 |
---|---|
files-path | 调用context.getFilesDir()路径下的文件 例 /data/user/0/包名/files |
cache-path | 调用context.getCacheDir()路径下的文件 例 /data/user/0/包名/cache |
external-cache-path | 调用context.getExternalCacheDir()路径下的文件 例 /storage/emulated/0/Android/data/包名/cache |
external-files-path | 调用context.getExternalFilesDir(String)路径下的文件 例 /storage/emulated/0/Android/data/包名/files/Music |
external-path | 调用Environment.getExternalStorageDirectory()路径下的文件 例 /storage/emulated/0 |
- uri API24以上的调用
在7.0(API24)之前直接打开文件代码如下
String mimeType = getTypeFromSuffix(file);
Uri uri = Uri.fromFile(file);
if (mimeType != null) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(uri, mimeType);
context.startActivity(intent);
}
在7.0(API24)以后需要用新的方法 修改如下
String mimeType = getTypeFromSuffix(file);
Uri uri = Uri.fromFile(file);
if (mimeType != null) {
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(context, context.getPackageName() + FILEPROVIDER, file);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
intent.setDataAndType(uri, mimeType);
context.startActivity(intent);
}
其中FILEPROVIDER
是String FILEPROVIDER = ".fileprovider";
其实这段就是最早上面清单文件的android:authorities
内的值
加入的两个flags是Intent.FLAG_GRANT_READ_URI_PERMISSION
(临时读取权限)和Intent.FLAG_GRANT_WRITE_URI_PERMISSION
(临时写入权限)
统一出现的getTypeFromSuffix(File)
方法是用来获取文件的后缀生成mimeType
让系统打开对应的文件工具