在7.0以下中打开文件时,通过intent调用系统安装得人软件打开文件就好了,但是在android7.0及以上的机子上这么做会报android.os.FileUriExposedException错误,
1)读取SD卡
2)动态申请权限
//设备API大于6.0时,主动申请权限(读取文件的权限)
public static void requestPermission(Activity context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 0)
}
}
}
3)读取文件
intent = OpenFileUtil.openFile(filePath+"/"+FileName+"."+end)
使用OpenFileUtil这个。链接: https://www.jianshu.com/p/1414101858c1
为了兼容Android7.0,获取文件Uri需要使用到FileProvider。
1)首先是AndroidManifest文件里面注册FileProvider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />//需要自己编写xml文件
2)provider_paths.xml文件的编写
// .表示根目录
3)打开文档方式为
intent = new Intent(Intent.ACTION_VIEW)
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
File txtFile = new File(filePath+"/"+FileName+"."+end)
Uri contentUri = FileProvider.getUriForFile(MyApplication.getContext(), BuildConfig.APPLICATION_ID+".provider", txtFile)
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
grantUriPermission(context, contentUri, intent)
startActivity(intent)
4)grantUriPermission方法添加权限
private static void grantUriPermission (Context context, Uri fileUri, Intent intent) {
List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName
context.grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
综合两种情况:
//判断是否是AndroidN以及更高的版本,Build.VERSION_CODES.N是Android 7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent = new Intent(Intent.ACTION_VIEW)
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
File txtFile = new File(filePath+"/"+FileName+"."+end)
Uri contentUri = FileProvider.getUriForFile(MyApplication.getContext(), BuildConfig.APPLICATION_ID+".provider", txtFile)
Log.i("文件地址:",contentUri.toString())
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
grantUriPermission(MyApplication.getContext(), contentUri, intent)
} else {
//7.0以下的可以打开文件了
intent = OpenFileUtil.openFile(filePath+"/"+FileName+"."+end)
}
MyApplication.getContext().startActivity(intent)
这个是隐私Intent调用,没有指定明确的Activity,而是设置了条件,只要符合都可以响应。
像你说的这种是根据文件类型做条件来判断,可以通过Intent的setDataAndType方法实现。
这个Type是指MIME Type,网上有文件名后缀与MIME类型的对照表,可以参考。
提供一个打开内存储根目录下1.txt文件的样例代码,仅供参考(前提是没给txt文件设置默认的打开应用)
Intent intent = new Intent()intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.setAction(Intent.ACTION_VIEW)
intent.setDataAndType(Uri.parse(Environment.getExternalStorageDirectory()+"/1.txt"), "text/plain")
startActivity(intent)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)