基于Java语言的安卓编程之二十四文件打开

时间:2022-06-04 01:12:28

前一天我们学习了使用OutputStreamWriter类和InputStreamReader类实现文件读写的方法。在对文件进行写操作时,可以通过OutputStreamWriter类的write()方法实现;在对文件进行读操作时,可以通过InputStreamReader类来创建BufferedReader类的对象,通过BufferedReader类的对象调用readLine()方法实现。

今天将学习使用指定程序打开指定文件的方法。当要打开的文件是SD卡中的“1.txt”文件时,如图1所示,选择打开该文件的程序。

基于Java语言的安卓编程之二十四文件打开

图1 选择打开文件的程序

当选择了“Open WithHTMLViewer”并且点击“JUSTONCE”或者“ALWAYS”后,“1.txt”文件被HTMLViewer打开,如图2所示。

基于Java语言的安卓编程之二十四文件打开

图2 1.txt文件的内容

要打开指定的文件,首先必须要获取指定文件的类型,即根据文件的后缀名得到文件的类型。

1 文件类型的获取

通过自定义方法getMIMEType()来获取文件类型。该方法的格式为

    private String getMIMEType(File f)

    {

}

其中,参数f是要打开的文件,方法的返回值是获取到的文件类型。

1.1 获取文件后缀名

文件的类型是通过文件后缀名来获取的。可以首先得到文件名的全称,之后找到文件名全称中文件名与后缀名的分隔符,即“.”的位置,最后截取该位置之后的字符串即可得到文件的后缀名。

    1  String fName =f.getName();

    2   String end =fName.substring(fName.lastIndexOf(".")+1,

3                          fName.length()).toLowerCase();

其中,第1行通过File类的对象f调用该类的getName()方法获取文件名的全称;第2-3行截取了文件的后缀名,其中lastIndexOf()是String类的方法,该方法的作用是返回最后一个指定字符串的位置,即“.”的位置;而substring()也是String类的方法,该方法的作用是截取字符串,第一个参数表示截取时的起始位置,即“.”的位置向右移动1位,第二个参数表示截取时的结束位置,即文件名的总长度,截取之后的后缀名再通过toLowerCase()方法全部转换为小写字母。

1.2 根据后缀名判断文件类型

在获得了文件后缀名之后,接下来根据后缀名来判断文件类型。比如,后缀名是“mp3”,则该文件的类型是“audio”,而如果后缀名是“mp4”,则该文件的类型是“video”。在自定义的getMIMEType()方法中,有如下代码

       Stringend = fName.substring(fName.lastIndexOf(".")+1, fName.length()).toLowerCase();

       if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")||

           end.equals("xmf")||end.equals("ogg")||end.equals("wav"))

       {

           type= "audio";

       }

       elseif(end.equals("3gp")||end.equals("mp4"))

       {

           type= "video";

       }

       elseif(end.equals("jpg")||end.equals("gif")||end.equals("png")||

              end.equals("jpeg")||end.equals("bmp"))

       {

           type= "image";

       }

       elseif(end.equals("apk"))

       {

           type= "application/vnd.android.package-archive";

       }

       else

       {

           type= "*";

       }

          

       if( end.equals("apk") )

       {

       }

       else

       {

           type+= "/*";

       }

音频文件的类型是“audio”,视频文件的类型是“video”,图片文件的类型是“image”,安装文件的类型是“application/vnd.android.package-archive”,其他文件的类型是“*”。

最后,得到的文件类型作为getMIMEType()方法的返回值。

return type;

2 文件的打开

在MainActivity类的定义中自定义一个名为openFile()的方法,代码如下所示:

    private void openFile(File f)

    {

........

}

其中,参数f为指定要打开的文件。在openFile()方法中,使用Intent实现指定文件的打开。Intent是安卓程序种各组件之间进行交互的一种重要方式,它可以指明当前组件想要执行的动作。对于打开文件来说,把Intent的动作指定为打开文件。

2.1 创建Intent对象

使用Intent类的构造函数创建该类的对象。

Intent intent = new Intent();

2.2 设置Intent属性

在定义了Intent类的对象后,接下来通过Intent类的对象设置Intent的属性。

2.2.1设置标志

通过addFlags()方法为Intent添加额外的标志。

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

其中,Intent.FLAG_ACTIVITY_NEW_TASK是Intent类中定义的常量字段值,该标志表示Intent将新创建一个活动,并将其作为第一个活动放到新的任务中。

2.2.2 设置动作

通过setAction()方法设置Intent的Action。Action是Intent的属性之一,表示Intent所要完成的一个抽象动作。

intent.setAction(android.content.Intent.ACTION_VIEW);

其中android.content.Intent.ACTION_VIEW是安卓系统中已经定义的Action操作的常量,用于数据的显示。

2.2.3 设置数据及类型

通过setDataAndType()方法设置Intent的数据及类型。其中,数据描述了Intent所操作的数据的URI,而类型则指定了传送数据的MIME类型。

URI是统一资源标识符(UniformResource Identifier)的英文缩写,它是一个用于标识某一互联网资源名称的字符串。MIME是多用途互联网邮件扩展类型(MultipurposeInternet Mail Extensions)的英文简写,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定的应用程序来打开该文件。

    1   String type = getMIMEType(f);

    2   intent.setDataAndType(Uri.fromFile(f),type);

第1行调用自定义方法getMIMEType()获取文件的类型,f是openFile()方法的参数;第2行中调用setDataAndType()设置Intent的数据及类型,其中setDataAndType()的第一个参数表示要打开文件对应的URI,通过Uri类的fromFile()方法获得,第二个参数type指定了数据类型。

2.2.4 启动活动

通过startActivity()方法来启动活动,并且将配置好Intent传递给该活动。

startActivity(intent);

3openFile()方法的调用

在MainActivity类中定义String类的对象来表示要打开的文件

private StringfilePath = "/storage/sd_external/1.txt";

之后,在MainActivity类的onCreate()方法中调用openFile()方法:

openFile(file);

4 小结

今天学习了通过Intent实现打开指定文件的方法。Intent是安卓程序种各组件之间进行交互的一种重要方式,通过指定它的标志、动作、数据以及类型,可以用指定的程序打开文件。