首页 > 其他分享 >调用Android设备中已经安装的软件打开各种类型的指定文件

调用Android设备中已经安装的软件打开各种类型的指定文件

时间:2023-10-11 14:32:47浏览次数:40  
标签:调用 各种类型 text application vnd intent put Android typeMap

最近因项目需求需要在android应用程序中下载一些附件,并打开这些附件,比如音视频视频以及图片这些。
开始还好,文件类型不是很多,但是后来需求又加上doc/xls/ppt等,后来又兼容了pdf。
这时候已经被需求改的烦不胜烦,觉得有必要针对打开本地文件做一个通用的封装了,判断File的类型,然后用指定类型的intent去通知系统。
比如这样:FileUtil.openFile(context, file)

首先我们知道通知系统打开一个指定类型的文件一般情况需要这样做:

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//设置intent的Action属性
intent.setAction(Intent.ACTION_VIEW);
//设置intent的data和Type属性。
intent.setDataAndType(fileUrl, fileType);
//通知系统打开文件
context.startActivity(intent);

这是一段比较通用的代码,根据不同的需求传入fileUrl和fileType,在实际使用中fileType会根据不同文件类型而不同。 比如 apk后缀的需要传入application/vnd.android.package-archive pdf后缀的需求传入application/pdf 。。。。

为了保证我们的工具类能够根据不同的文件类型能够拿到正确的文件类型,这时候需要准备一个相对丰富全面的文件后缀-文件类型的映射。 而因为工作需求我收集了下面这些,并讲让他们存入了一个HashMap

public class FileUtil {

    private static final Map<String, String> typeMap = new HashMap<>();

    static {
        typeMap.put(".3gp", "video/3gpp");
        typeMap.put(".apk", "application/vnd.android.package-archive");
        typeMap.put(".asf", "video/x-ms-asf");
        typeMap.put(".avi", "video/x-msvideo");
        typeMap.put(".bin", "application/octet-stream");
        typeMap.put(".bmp", "image/bmp");
        typeMap.put(".c", "text/plain");
        typeMap.put(".class", "application/octet-stream");
        typeMap.put(".conf", "text/plain");
        typeMap.put(".cpp", "text/plain");
        typeMap.put(".doc", "application/msword");
        typeMap.put(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        typeMap.put(".xls", "application/vnd.ms-excel");
        typeMap.put(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        typeMap.put(".exe", "application/octet-stream");
        typeMap.put(".gif", "image/gif");
        typeMap.put(".gtar", "application/x-gtar");
        typeMap.put(".gz", "application/x-gzip");
        typeMap.put(".h", "text/plain");
        typeMap.put(".htm", "text/html");
        typeMap.put(".html", "text/html");
        typeMap.put(".jar", "application/java-archive");
        typeMap.put(".java", "text/plain");
        typeMap.put(".jpeg", "image/jpeg");
        typeMap.put(".jpg", "image/jpeg");
        typeMap.put(".js", "application/x-javascript");
        typeMap.put(".log", "text/plain");
        typeMap.put(".m3u", "audio/x-mpegurl");
        typeMap.put(".m4a", "audio/mp4a-latm");
        typeMap.put(".m4b", "audio/mp4a-latm");
        typeMap.put(".m4p", "audio/mp4a-latm");
        typeMap.put(".m4u", "video/vnd.mpegurl");
        typeMap.put(".m4v", "video/x-m4v");
        typeMap.put(".mov", "video/quicktime");
        typeMap.put(".mp2", "audio/x-mpeg");
        typeMap.put(".mp3", "audio/x-mpeg");
        typeMap.put(".mp4", "video/mp4");
        typeMap.put(".mpc", "application/vnd.mpohun.certificate");
        typeMap.put(".mpe", "video/mpeg");
        typeMap.put(".mpeg", "video/mpeg");
        typeMap.put(".mpg", "video/mpeg");
        typeMap.put(".mpg4", "video/mp4");
        typeMap.put(".mpga", "audio/mpeg");
        typeMap.put(".msg", "application/vnd.ms-outlook");
        typeMap.put(".ogg", "audio/ogg");
        typeMap.put(".pdf", "application/pdf");
        typeMap.put(".png", "image/png");
        typeMap.put(".pps", "application/vnd.ms-powerpoint");
        typeMap.put(".ppt", "application/vnd.ms-powerpoint");
        typeMap.put(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
        typeMap.put(".prop", "text/plain");
        typeMap.put(".rc", "text/plain");
        typeMap.put(".rmvb", "audio/x-pn-realaudio");
        typeMap.put(".rtf", "application/rtf");
        typeMap.put(".sh", "text/plain");
        typeMap.put(".tar", "application/x-tar");
        typeMap.put(".tgz", "application/x-compressed");
        typeMap.put(".txt", "text/plain");
        typeMap.put(".wav", "audio/x-wav");
        typeMap.put(".wma", "audio/x-ms-wma");
        typeMap.put(".wmv", "audio/x-ms-wmv");
        typeMap.put(".wps", "application/vnd.ms-works");
        typeMap.put(".xml", "text/plain");
        typeMap.put(".z", "application/x-compress");
        typeMap.put(".zip", "application/x-zip-compressed");
        typeMap.put("", "*/*");
    }
}

基本上覆盖比较主流的文件后缀,如果以后遇到漏掉了的会继续往里面追加。 好了,接下来我们需要写一段代码来根据文件来判断文件类型了。

private static String getFileType(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 ("".equals(end)) return type;
        String typeFound = typeMap.get(end);
        return typeFound == null ? type : typeFound;
    }

然后把我们刚开始的打开文件的代码替换为可用通用执行的:

public static void openFile(Context context, File file) {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //设置intent的Action属性
        intent.setAction(Intent.ACTION_VIEW);
        //获取文件file的类型
        String type = getFileType(file);
        //设置intent的data和Type属性。
        intent.setDataAndType(Uri.fromFile(file), type);
        //跳转
        context.startActivity(intent);
    }

到此为止就可用按照我们开始的设想来使用这个方法来打开文件啦:

FileUtil.openFile(context, file)

标签:调用,各种类型,text,application,vnd,intent,put,Android,typeMap
From: https://blog.51cto.com/u_12925694/7810420

相关文章

  • win32汇编-调用API
      Win32API是用堆栈来传递参数的,调用者把参数一个个压入堆栈,DLL中的函数程序再从堆栈中取出参数处理,并在返回之前将堆栈中已经无用的参数丢弃。在Microsoft发布的《MicrosoftWin32Programmer'sReference》中定义了常用API的参数和函数声明,先来看消息框函数的声明:......
  • 视频直播源码,AndroidStudio登录页面的切换
    视频直播源码,AndroidStudio登录页面的切换xml代码 <?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  ......
  • 关于linux:Android的/ storage / emulated / 0和/ data / media / 0的不同权限
     Android/storage/emulated/0and/data/media/0differentpermissions我有LGG3智能手机。在文件系统探索期间,我发现/storage/emulated/0/...目录(从系统接收到我的本地用户)具有不允许chmod和chown操作的权限。当我尝试将某些文件更改为777时,我收到了0个结果......
  • 调用系统的提示音和振动
     #import<AudioToolbox/AudioToolbox.h> //你不能修改震动参数,每个调用都会生成一个简短的1~2秒的震动。在不支持震动的平台上(ipodtouch),该调用不执行任何操作,但也不会发生错误!)AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//震动 //一句话解决iphonei......
  • struts2调用javabean中的方法
    1.<s:setname="str"value="helloworld"></s:set><s:propertyvalue="%{@com.Test@func(#str)}"/>其中func是com.Test中的一个静态方法2.<s:beanname="com.Test"id="t"><......
  • 使用C#调用7Zip解压文件
    使用C#调用7Zip解压文件可以输入密码可以省略输出的路径则默认创建压缩包同名文件夹Console.WriteLine("你好,接下来开始解压文件");ExtractArchiveWithPassword(@"E:\压缩文件测试\压缩文件_Orgion\V_1696602827.7z",......
  • 【Azure Developer】示例: 在中国区调用MSGraph SDK通过User principal name获取到Use
    问题描述示例调用MSGraphSDK通过Userprincipalname获取到User信息,如ObjectID。 参考资料选择MicrosoftGraph身份验证提供程序: https://learn.microsoft.com/zh-cn/graph/sdks/choose-authentication-providers?tabs=java#using-a-client-secret-2MicrosoftGraphSDKfor......
  • android 13 指纹整理
    android13指纹整理术语缩略语英文全名中文解释TEETrustedExecutionEnvironment可信执行环境,存在于主CPU中的一块安全运行环境。CAClientApplication客户端应用,通常指运行在REE的应用TATrustedApplication可信应用,通常指运行在TEE环境的应用......
  • lua中调用C#的重载方法
    localm1=typeof(CS.TestClass):GetMethod("Test")--获取c#中的重载函数localf1=xlua.tofunction(m1)--将重载函数转换为lua函数f1(self);lua是没有base的,也就是说想使用C#的base.Test(),直接调用子类的self:Test()是调用子类重写的方法,这个时候如果想调用父......
  • 【Android面试】2023最新面试专题六:Java并发编程(一)
    1、假如只有一个cpu,单核,多线程还有用吗?详细讲解享学课堂移动互联网系统课程:架构师筑基必备技能《线程与进程的理论知识入门1》这道题想考察什么?是否了解并发相关的理论知识考察的知识点cpu多线程的基本概念操作系统的调度任务机制CPU密集型和IO密集型理论考生应该如何回答CPU的执......