Android杂谈--打开文件的Intent及使用

来源:互联网 发布:北斗手机导航软件 编辑:程序博客网 时间:2024/05/18 11:27

在写文件管理系统时会用到各种打开不同格式的文件的需求,由于Android系统默认内置了一些可以打开的系统应用,但还是不能满足需求,比如打开视频文件、word等,需要安装相应的播放软件才可以使用,这时程序会通过Intent查找可以使用的软件

实现通过代码打开一个文件需要2部分,一部分是要获取到不同文件的后缀,以便根据需求匹配相应的Intent,另一个就是不同格式的文件打开的Intent不同

1、在values目录下定义后缀数组文件fileendings

<?xml version="1.0" encoding="utf-8"?><resources><array name="fileEndingImage">        <item>.png</item>        <item>.gif</item>        <item>.jpg</item>        <item>.jpeg</item>        <item>.bmp</item>    </array><array name="fileEndingAudio">        <item>.mp3</item>        <item>.wav</item>        <item>.ogg</item>        <item>.midi</item>    </array><array name="fileEndingVideo">        <item>.mp4</item>        <item>.rmvb</item>        <item>.avi</item>        <item>.flv</item>    </array><array name="fileEndingPackage">        <item>.jar</item>        <item>.zip</item>        <item>.rar</item>        <item>.gz</item>        <item>.apk</item>        <item>.img</item>    </array><array name="fileEndingWebText">        <item>.htm</item>        <item>.html</item>        <item>.php</item>        <item>.jsp</item>    </array><array name="fileEndingText">        <item>.txt</item>        <item>.java</item>        <item>.c</item>        <item>.cpp</item>        <item>.py</item>        <item>.xml</item>        <item>.json</item>        <item>.log</item>    </array><array name="fileEndingWord">    <item>.doc</item>    <item>.docx</item></array><array name="fileEndingExcel">    <item>.xls</item>    <item>.xlsx</item></array><array name="fileEndingPPT">    <item>.ppt</item>    <item>.pptx</item></array><array name="fileEndingPdf">    <item>.pdf</item></array></resources>


2、定义OpenFiles工具类,只需传输File参数即可,然后通过返回的Intent打开文件

 

public class OpenFiles {     //android获取一个用于打开HTML文件的intent       public static Intent getHtmlFileIntent(File file)       {           Uri uri = Uri.parse(file.toString()).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(file.toString()).build();           Intent intent = new Intent("android.intent.action.VIEW");           intent.setDataAndType(uri, "text/html");           return intent;       }     //android获取一个用于打开图片文件的intent       public static Intent getImageFileIntent(File file)       {           Intent intent = new Intent("android.intent.action.VIEW");           intent.addCategory("android.intent.category.DEFAULT");           intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);           Uri uri = Uri.fromFile(file);           intent.setDataAndType(uri, "image/*");           return intent;       }       //android获取一个用于打开PDF文件的intent       public static Intent getPdfFileIntent(File file)       {         Intent intent = new Intent("android.intent.action.VIEW");         intent.addCategory("android.intent.category.DEFAULT");         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         Uri uri = Uri.fromFile(file);         intent.setDataAndType(uri, "application/pdf");         return intent;       }     //android获取一个用于打开文本文件的intent     public static Intent getTextFileIntent(File file)     {           Intent intent = new Intent("android.intent.action.VIEW");       intent.addCategory("android.intent.category.DEFAULT");       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);       Uri uri = Uri.fromFile(file);       intent.setDataAndType(uri, "text/plain");       return intent;     }         //android获取一个用于打开音频文件的intent       public static Intent getAudioFileIntent(File file)       {         Intent intent = new Intent("android.intent.action.VIEW");         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);         intent.putExtra("oneshot", 0);         intent.putExtra("configchange", 0);         Uri uri = Uri.fromFile(file);         intent.setDataAndType(uri, "audio/*");         return intent;       }       //android获取一个用于打开视频文件的intent       public static Intent getVideoFileIntent(File file)       {         Intent intent = new Intent("android.intent.action.VIEW");         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);         intent.putExtra("oneshot", 0);         intent.putExtra("configchange", 0);         Uri uri = Uri.fromFile(file);         intent.setDataAndType(uri, "video/*");         return intent;       }               //android获取一个用于打开CHM文件的intent       public static Intent getChmFileIntent(File file)       {         Intent intent = new Intent("android.intent.action.VIEW");         intent.addCategory("android.intent.category.DEFAULT");         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         Uri uri = Uri.fromFile(file);         intent.setDataAndType(uri, "application/x-chm");         return intent;       }             //android获取一个用于打开Word文件的intent       public static Intent getWordFileIntent(File file)       {         Intent intent = new Intent("android.intent.action.VIEW");         intent.addCategory("android.intent.category.DEFAULT");         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         Uri uri = Uri.fromFile(file);         intent.setDataAndType(uri, "application/msword");         return intent;       }     //android获取一个用于打开Excel文件的intent       public static Intent getExcelFileIntent(File file)       {         Intent intent = new Intent("android.intent.action.VIEW");         intent.addCategory("android.intent.category.DEFAULT");         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         Uri uri = Uri.fromFile(file);         intent.setDataAndType(uri, "application/vnd.ms-excel");         return intent;       }     //android获取一个用于打开PPT文件的intent       public static Intent getPPTFileIntent(File file)       {         Intent intent = new Intent("android.intent.action.VIEW");         intent.addCategory("android.intent.category.DEFAULT");         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         Uri uri = Uri.fromFile(file);         intent.setDataAndType(uri, "application/vnd.ms-powerpoint");         return intent;       }       //android获取一个用于打开apk文件的intent       public static Intent getApkFileIntent(File file)       {           Intent intent = new Intent();             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);             intent.setAction(android.content.Intent.ACTION_VIEW);             intent.setDataAndType(Uri.fromFile(file),  "application/vnd.android.package-archive");             return intent;       }              }


3、定义用于检查要打开的文件的后缀是否在遍历后缀数组中

    private boolean checkEndsWithInStringArray(String checkItsEnd,                     String[] fileEndings){        for(String aEnd : fileEndings){            if(checkItsEnd.endsWith(aEnd))                return true;        }        return false;    }


4、通过调用OpenFiles类返回的Intent,打开相应的文件

 

 

            if(currentPath!=null&¤tPath.isFile())                {                    String fileName = currentPath.toString();                    Intent intent;                    if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingImage))){                        intent = OpenFiles.getImageFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingWebText))){                        intent = OpenFiles.getHtmlFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingPackage))){                        intent = OpenFiles.getApkFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingAudio))){                        intent = OpenFiles.getAudioFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingVideo))){                        intent = OpenFiles.getVideoFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingText))){                        intent = OpenFiles.getTextFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingPdf))){                        intent = OpenFiles.getPdfFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingWord))){                        intent = OpenFiles.getWordFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingExcel))){                        intent = OpenFiles.getExcelFileIntent(currentPath);                        startActivity(intent);                    }else if(checkEndsWithInStringArray(fileName, getResources().                            getStringArray(R.array.fileEndingPPT))){                        intent = OpenFiles.getPPTFileIntent(currentPath);                        startActivity(intent);                    }else                    {                        showMessage("无法打开,请安装相应的软件!");                    }                }else                {                    showMessage("对不起,这不是文件!");                }


 

 

 

 

 

===========================================================================

让自己的应用出现在软件的选择列表中

比如通过文档查看器打开一个文本文件时,会弹出一个可用来打开的软件列表;
如何让自己的软件也出现在该列表中呢? 通过设置AndroidManifest.xml文件即可:

    <activity        android:name=".EasyNote"        android:label="@string/app_name"        android:launchMode="singleTask"        android:screenOrientation="portrait"        >        <intent-filter>            <action android:name="android.intent.action.MAIN"/>            <category android:name="android.intent.category.LAUNCHER"/>        </intent-filter>                <intent-filter>            <action android:name="android.intent.action.VIEW"/>            <category android:name="android.intent.category.DEFAULT"/>            <data android:mimeType="text/plain"/>        </intent-filter>            </activity>

 

第一个<intent-filter>标签是每个程序都有的,关键是要添加第二个!这样你的应用程序就会出现在默认打开列表了。。。

注意需要将mimeType修改成你需要的类型,文本文件当然就是:text/plain

还有其它常用的如:

  • text/plain(纯文本)
  • text/html(HTML文档)
  • application/xhtml+xml(XHTML文档)
  • image/gif(GIF图像)
  • image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
  • image/png(PNG图像)【PHP中为:image/x-png】
  • video/mpeg(MPEG动画)
  • application/octet-stream(任意的二进制数据)
  • application/pdf(PDF文档)
  • application/msword(Microsoft Word文件)
  • message/rfc822(RFC 822形式)
  • multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
  • application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
  • multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)

 

 

原创粉丝点击