1. 程式人生 > >讓檔案管理器識別某種型別的檔案並顯示相應型別的圖片

讓檔案管理器識別某種型別的檔案並顯示相應型別的圖片

  • 首先找到載入型別圖片的位置
  • 在vender/mediatek/properties/packags/apps/FileManager/src/com/mediatek/filemanager/FileInfoAdapter.java中有方法
    private void setIcon(FileViewHolder viewHolder,FileInfo fileInfo,int viewDirection){
    Bitmap icon=IconManager,getInstance().getIcon(mResources,fileInfo,mService,viewDirection);
    viewHolder.mIcon.setImageBitmap(icon);
    ......}

  • 到vender/mediatek/properties/packags/apps/FileManager/src/com/mediatek/filemanager/IconManager.java中去看看getIcon()方法
    public Bitmap getIcon(Resources res,FileInfo fileInfo,FileManagerService service,int viewDirection){
    ......
    icon=getFlolderIcon(fileInfo,isExternal);
    ......
    int iconId=getDrawableId(service,mimeType);
    ......}

  • 這裡我們看getDrawableId方法,重點來了,首先來看一下這個方法的具體內容
    public static int getDrawableId(Context context,String mimeType){
    if(TextUtils.isEmpty(mimeType)){
    return R.drawable.fm_unknown;
    }else if(mimeType.startsWith("application/zip")){
    return R.drawable.fm_zip;
    }else if(mimeType.startsWith("text/plain")){
    return R.drawable.fm_txt;
    }else if......
    ......
    return getCustomDrawableId(context,mimeType);
    }



  • 該方法中直接進行判斷的mimeType資料,是手機無論是否自帶或者安裝了能夠開啟該型別檔案的應用都會顯示與之對應的檔案型別圖片,而通過方法getCustomDrawableId的mimeType資料都是要在手機支援開啟該型別檔案的條件下才會顯示對應的檔案型別圖片的。如果要在任何情況下都顯示圖示,那就要在這個位置新增相應的else if語句,例如上面新增text圖示的內容。好來看一下  getCustomDrawableId這個方法     
    private static int getCustomDrawableId(Context context,String mimeType){
    if(!OptionsUtils.isOP01Surported()){
    return getUnknownTypeDrawableId();//這是一個巨集控,表示只支援OP01
    }
    int fileType=MediaFileManager.getFileTypeForMimeType(mimeType);
    if(!sCustomDrableIdsMap.containsKey(fileType)){
    return getUnknownTypeDrawbleId():
    }
    return sCustomDrableIdsMap.get(fileType);

  • 首先看一下MediaFileManager這個類,內容如下:
    public class MediaFileManager{
    public static final int FILE_TYPE_MS_POWERPOINT=MediaFile.FILE_TYPE_MS_POWERPOINT;
    public static final int FILE_TYPE_MS_WORD=MediaFile.FILE_TYPE_MS_WORD;
    public static final int FILE_TYPE_HTML=MediaFile.FILE_TYPE_HTML;
    ......
    
    public static int getFileTypeForMimeType(String mimeType){
    return MediaFile.getFileTypeForMimeType(mimeType);
    }
    }

  • 這裡需要新增你要顯示的型別的標誌,例如程式碼中新增的HTML型別,這裡需要看一下MediaFile這個類和它的getFileTypeForMimeType方法,這裡需要注意MediaFile這個類不在當前FileManager這個APP中,它是一個框架類,位置是frameworks/base/media/java/android/media/MediaFile.java,裡面主要的內容有
    public class MediaFile{
    public static final int FILE_TYPE_MP3 =101;
    public static final int FILE_TYPE_M4A =102;
    public static final int FILE_TYPE_WAV =103;
    public static final int FILE_TYPE_AMR=104;
    public static final int FILE_TYPE_AMR=104;
    public static final int FILE_TYPE_AWB=105;
    public static final int FILE_TYPE_WMA=106;
    .
    .
    .
    .
    .
    .
    //定義HashMap,鍵是mimeType型別字串,值是檔案型別(上面定義的int常量)
    private static final HashMap<String,MediaFileType>sFileTypeMap=new HashMap<String,MediaFileType>();
    private static final HashMap<String,Integer>sMimeTypeMap=new HashMap<String,Integer>();
    
    //向HashMap中新增資料
    static void addFileType(String extension,int fileType,String mimeType){
    sFileTypeMap.put(extension,new MediaFileType(fileType,mimeType));
    sMimeTypeMap.put(mimeType,Integer.valueOf(fileType);
    }
    
    //呼叫addFiletype方法,將副檔名,檔案型別,mimeType型別資料傳入
    addFileType("3GP",FILE_TYPE_3GPP3,"audio/3gpp");
    addFileType("3GA",FILE_TYPE_3GA,"audio/3gpp");
    addFileType("MOV",FILE_TYPE_QUICKTIME_AUDIO,"audio/quicktime");
    addFileType("PDF",FILE_TYPE_PDF,"application/pdf");
    .
    .
    .
    .
    .
    .
    
    //根據MImeType型別得到檔案型別
    public static int getFileTypeForMimeType(String mimeType){
    Integer value=sMimeTypeMap.get(mimeType);
    return (value==null ? 0:value.intValue()):
    }
    
    

  • 回到getCustomDrawableId方法,下面要看sCustomDrableIdsMap,看是如何向其中新增資料的,新增資料的方法是updateCustomDrableMap,內容如下:
    public static void updateCustomDrableMap(Context context){
    sCustomDrableIdsMap.clear();
    
    //for pdf mime type
    if(isSupportedByCurrentSystem(context,"application/pdf")){
    sCustomDrableIdsMap.put(MediaFileManager.FILE_TYPE_PDF,R.drawable.fm_pdf);
    }
    //for html mime type
    if(isSupportedByCurrentSystem(context,"text/html")){
    sCustomDrableIdsMap.put(MediaFileManager.FILE_TYPE_HTML,R.drawable.fm_html);
    }
    .
    .
    .
    .
    .
    .
    }

  • 在這裡新增你要新增的檔案型別,例如上面的PDF和HTML,而isSupportedByCurrentSystem方法則是判斷當前系統是否擁有可以開啟(或者支援)該型別資料的應用,如果有,資料型別id和檔案資源id就會被put到map中,isSupportedByCurrentSystem方法的內容如下
    private static boolean isSupportedByCurrentSystem(Context context,String mimeType){
    PackageManager packageManager=context.getPackageManager();
    Intent intent=new Intent(Intent.ACTION_VIEW);
    intent.setType(mimeType);
    ResolveInfo info=packagerManager.resolveActivity(intent,PackageManager.MATCH_DEFAULT_ONLY);
    return info!=null;
    }

  • 查詢mimeType資料型別連結:
  • http://www.cnblogs.com/olartan/p/4111180.html