安卓7.0文件路径适配 FileProvider

前言

原先有适配过,但是当时就copy能用就行了。最近在写轮子工具,就再次查了下资料,就顺便整个都了解一下,记录下来。


适配7.0(既调用FileProvider)

  1. 创建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:exportedfalse表示我们的provider不需要对外开放。
android:grantUriPermissions申明为true,你才能获取临时共享权限。
  1. 在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
  1. 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);
        }

其中FILEPROVIDERString FILEPROVIDER = ".fileprovider"; 其实这段就是最早上面清单文件的android:authorities内的值
加入的两个flags是Intent.FLAG_GRANT_READ_URI_PERMISSION (临时读取权限)和Intent.FLAG_GRANT_WRITE_URI_PERMISSION(临时写入权限)
统一出现的getTypeFromSuffix(File)方法是用来获取文件的后缀生成mimeType让系统打开对应的文件工具


资料

Android7.0适配总结
谷歌中国 - Android 7.0 行为变更

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓7.0系统中,要读取txt文件可以按照以下步骤进行: 首先,需要在AndroidManifest.xml文件中添加读取外部存储的权限。可以在<manifest>标签下添加如下代码: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 然后,可以在Activity的代码中使用Java代码来读取txt文件。例如,可以使用如下代码: String filePath = "/sdcard/sample.txt"; // 定义txt文件路径 File file = new File(filePath); // 创建文件对象 StringBuilder text = new StringBuilder(); // 用来保存文件内容的字符串 try { BufferedReader br = new BufferedReader(new FileReader(file)); // 读取文件 String line; while ((line = br.readLine()) != null) { text.append(line); // 将每一行文本添加到StringBuilder中 } br.close(); // 关闭文件读取流 } catch (IOException e) { e.printStackTrace(); } 上述代码将txt文件路径定义为"/sdcard/sample.txt",可根据实际情况修改路径。 最后,通过text.toString()可以获取到读取的txt文件内容,可以根据需要进行处理或显示。 需要注意的是,在安卓7.0及以上的系统中,对于读取外部存储权限有一些特殊要求,需要动态申请权限。可以使用以下代码在运行时申请权限: if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE); } 其中REQUEST_CODE是自定义的请求码,在onRequestPermissionsResult()方法中进行回调处理。 以上就是在安卓7.0系统中读取txt文件的基本步骤,根据实际需求可以进行相应的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值