打开文档

private void openFile(File file) {try {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//设置intent的Action属性intent.setAction(Intent.ACTION_VIEW);//获取文件file的MIME类型String type = getMIMEType(file);//设置intent的data和Type属性。android 7.0以上crash,改用providerif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {Uri fileUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".provider", file);//android 7.0以上intent.setDataAndType(fileUri, type);grantUriPermission(mContext, fileUri, intent);} else {intent.setDataAndType(/*uri*/Uri.fromFile(file), type);}//跳转mContext.startActivity(intent);} catch (Exception e) {e.printStackTrace();}}private static void grantUriPermission(Context context, Uri fileUri, Intent intent) {List<ResolveInfo> 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);}}/*** 根据文件后缀名获得对应的MIME类型。** @param file*/private static String getMIMEType(File file) {String type = "*/*";String fName = file.getName();//获取后缀名前的分隔符"."在fName中的位置。int dotIndex = fName.lastIndexOf(".");if (dotIndex < 0) {return type;}
/* 获取文件的后缀名 */String end = fName.substring(dotIndex, fName.length()).toLowerCase();if (end == "") return type;//在MIME和文件类型的匹配表中找到对应的MIME类型。for (int i = 0; i < MIME_MapTable.length; i++) { //MIME_MapTable??在这里你一定有疑问,这个MIME_MapTable是什么?if (end.equals(MIME_MapTable[i][0]))type = MIME_MapTable[i][1];}return type;}private static final String[][] MIME_MapTable = {//{后缀名, MIME类型}{".3gp", "video/3gpp"},{".apk", "application/vnd.android.package-archive"},{".asf", "video/x-ms-asf"},{".avi", "video/x-msvideo"},{".bin", "application/octet-stream"},{".bmp", "image/bmp"},{".c", "text/plain"},{".class", "application/octet-stream"},{".conf", "text/plain"},{".cpp", "text/plain"},{".doc", "application/msword"},{".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},{".xls", "application/vnd.ms-excel"},{".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},{".exe", "application/octet-stream"},{".gif", "image/gif"},{".gtar", "application/x-gtar"},{".gz", "application/x-gzip"},{".h", "text/plain"},{".htm", "text/html"},{".html", "text/html"},{".jar", "application/java-archive"},{".java", "text/plain"},{".jpeg", "image/jpeg"},{".jpg", "image/jpeg"},{".js", "application/x-javascript"},{".log", "text/plain"},{".m3u", "audio/x-mpegurl"},{".m4a", "audio/mp4a-latm"},{".m4b", "audio/mp4a-latm"},{".m4p", "audio/mp4a-latm"},{".m4u", "video/vnd.mpegurl"},{".m4v", "video/x-m4v"},{".mov", "video/quicktime"},{".mp2", "audio/x-mpeg"},{".mp3", "audio/x-mpeg"},{".mp4", "video/mp4"},{".mpc", "application/vnd.mpohun.certificate"},{".mpe", "video/mpeg"},{".mpeg", "video/mpeg"},{".mpg", "video/mpeg"},{".mpg4", "video/mp4"},{".mpga", "audio/mpeg"},{".msg", "application/vnd.ms-outlook"},{".ogg", "audio/ogg"},{".pdf", "application/pdf"},{".png", "image/png"},{".pps", "application/vnd.ms-powerpoint"},{".ppt", "application/vnd.ms-powerpoint"},{".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},{".prop", "text/plain"},{".rc", "text/plain"},{".rmvb", "audio/x-pn-realaudio"},{".rtf", "application/rtf"},{".sh", "text/plain"},{".tar", "application/x-tar"},{".tgz", "application/x-compressed"},{".txt", "text/plain"},{".wav", "audio/x-wav"},{".wma", "audio/x-ms-wma"},{".wmv", "audio/x-ms-wmv"},{".wps", "application/vnd.ms-works"},{".xml", "text/plain"},{".z", "application/x-compress"},{".zip", "application/x-zip-compressed"},{"", "*/*"}};

在Manifest.xml中配置

<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="包名.FileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/></provider>

在资源文件中新建xml文件file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="files_root"path="Android/data/com.dfy.ming.lawyer/"/><external-pathname="external_storage_root"path="."/>
</paths>

对于8.0安装:
//替换安装方法

void update() {if (Build.VERSION.SDK_INT >= 26) {boolean b = getPackageManager().canRequestPackageInstalls();if (b) {installApk();//安装应用的逻辑(写自己的就可以)} else {//请求安装未知应用来源的权限Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);startActivityForResult(intent, 10086);}} else {installApk();}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && requestCode == 10086) {installApk();//再次执行安装流程,包含权限判等}}private void installApk() {File apkFile = new File(RyhuiApp.path);Intent intent = new Intent(Intent.ACTION_VIEW);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//provider authoritiesUri apkUri = FileProvider.getUriForFile(context.getApplicationContext(), "com.finance.ryhui.pepe.fileProvider", apkFile);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);intent.setDataAndType(apkUri, "application/vnd.android.package-archive");} else {intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");}context.startActivity(intent);}

Android应用内用其他应用打开文档相关推荐

  1. Android基础——从存储介质打开文档

    从存储介质打开文档 使用存储访问框架(SAF-Storage Access Framework)打开文件 概览 控制流程 创建客户端 搜索文档 搜索结果 检查文档元数据 打开文档 Bitmap Inp ...

  2. Android应用内打开.docx/.pdf/.xlsx/.txt等文档——腾讯TBS

                                   Android应用内打开.docx/.pdf/.xlsx/.txt等文档-腾讯TBS 1.功能借鉴:https://blog.csdn.n ...

  3. android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!

    简单基于注释的API来处理运行时6.0权限配置 热门度(没变化) 10.0/10 (没变化) ">10.0 活跃度(没变化) 0.8/10 (没变化) ">0.8 Wa ...

  4. 配置Android Studio内置jre的环境变量

    下载Android Studio时,包括jre.将这个jre配置过环境变量后,就可以在全局使用了.但是和官网安装jre的环境配置略有不同. 图一  jre官网下载,安装后的目录 图二  Android ...

  5. Android切换泰语,Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈. 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先.实现了中文,英文,泰语的 ...

  6. 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)

    使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等) 传送门 转载于:https://www.cnblogs.com/momozjm/p/9389912.html

  7. android 截屏 分享,Android应用内截图分享的实现记录

    Android应用内截图分享的实现记录 近期的项目中有个需求,需要将某个表示用户身份的页面整个截取下来,分享到微信微博.网上也很多的解决方案,我也分享下我自己的爬坑记录. 需求分析 有个页面,用于展示 ...

  8. Android应用内社区SDK技术架构浅析

    Android应用内社区SDK技术架构浅析 图1为雪球财经自选界面,图2是雪球财经App内的社区,也就是动态页面. 一.以友盟微社区为例 简单来说,友盟的微社区就是一款帮助开发者在应用中快速搭建一个社 ...

  9. Android应用内安装apk包

    Android应用内安装 public static void installApk(Activity context, String filePath, int requestCode) {Log. ...

最新文章

  1. markdown自动生成侧边栏TOC /目录
  2. linux下查看服务器性能,linux命令查看服务器性能
  3. python 读写数据
  4. mac搭建mongodb
  5. java printwrite_Java PrintWriter write(int)用法及代码示例
  6. 工作中用到的设计模式?
  7. VBS脚本获取安全标识符SID(Security Identifiers)的方法
  8. VC++中进程与多进程管理的方法[转]
  9. POJ 1581 优先队列 priority_queue -- 比赛胜者求解
  10. html5伪类触发机制,HTML5表单验证
  11. 干货|Elastic 在顶级互联网公司的应用案例浅析
  12. 类名作为方法和形参的返回值
  13. web前端:技术提升必学的HTML用法
  14. Linux之DHCP服务及配置
  15. 综合评价法之秩和比法(RSR)
  16. 如何批量下载上海证券交易所上市公司年报
  17. c语言 求圆周长 圆面积 圆球表面积 圆球体积 圆柱体积
  18. 去掉网页从网页中拷贝到word中段落带有的背景颜色
  19. 2022CCPC广州 CM
  20. 年薪二十、三十、四十万的Java程序员的生活现状

热门文章

  1. 【最全干货】SQL注入大合集
  2. 从比特大陆AI芯片入局智慧城市看阿里腾讯的城市“攻坚战”
  3. 毕业设计论文选题_kaic
  4. 英飞凌 AURIX TC3XX 系列单片机的 SOTA 功能实现
  5. win7系统怎么分区【系统天地】
  6. Label Smoothing介绍及其代码实现
  7. Windows: net和shutdown命令重启远程电脑
  8. 专职安全员办公用计算机,3.安全生产审批制度、专项费用保证措施
  9. Midjourney V5 与 V4 哪个更好?综合评测,Prompt 全公开!
  10. linux vfs open函数,VFS文件系统结构分析