Android雜談--打開文件的Intent及使用


在寫文件管理系統時會用到各種打開不同格式的文件的需求,由於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&&currentPath.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("對不起,這不是文件!");
                }

效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM