zoukankan      html  css  js  c++  java
  • android简易文件管理器的用法

      很久没有写东西了,鉴于某某同学文件管理器不会,这里简单介绍一下,同时写一个demon,参考了网上别人写的代码,自己也学习学习,研究研究。

      首先所谓文件管理器,看起来就是一个列表,列表里面是文件夹或者文件,首先把布局写出来,我想在最上方的左边显示文件的路径,右边显示该路径下的文件个数,其实还是一个遍历文件,然后用列表显示出来的问题。下面是ListView,用来显示文件列表。下面是运行的效果图:

    主界面的布局文件如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6     <RelativeLayout 
     7         android:id="@+id/top"
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content">
    10        <TextView 
    11            android:id="@+id/path"
    12            android:layout_width="wrap_content"
    13            android:layout_height="wrap_content"
    14            android:layout_alignParentLeft="true"
    15            android:layout_centerVertical="true"
    16            android:textSize="@*android:dimen/list_item_size"
    17            android:textColor="@android:color/white"/>
    18         
    19         <TextView 
    20             android:id="@+id/item_count"
    21             android:layout_width="wrap_content"
    22             android:layout_height="wrap_content"
    23             android:textSize="@*android:dimen/list_item_size"
    24             android:textColor="@android:color/white"
    25             android:layout_alignParentRight="true"
    26             android:layout_centerVertical="true"/>
    27     </RelativeLayout>
    28    <View 
    29         android:layout_width="match_parent"
    30         android:layout_height="2dip"
    31         android:background="#09c"/>
    32 
    33    <LinearLayout
    34         android:orientation="vertical"
    35         android:layout_width="match_parent"
    36         android:layout_height="match_parent">
    37         
    38         <ListView 
    39             android:id="@+id/file_list"
    40             android:layout_height="match_parent"
    41             android:layout_width="match_parent"
    42             android:fadingEdge="none"
    43             android:cacheColorHint="@android:color/transparent"/>
    44     </LinearLayout>
    45 </LinearLayout>

    首先在oncreate方法里面调用一个方法去获取布局文件里面的id:

    1 @Override
    2     protected void onCreate (Bundle savedInstanceState) {
    3         super.onCreate(savedInstanceState);
    4         setContentView(R.layout.file_manager);
    5         initView();
    6     }

    initView之后添加apk的权限,777 表示可读可写可操作。

     1 private void initView() {
     2         mListView = (ListView) findViewById(R.id.file_list);
     3         mPathView = (TextView) findViewById(R.id.path);
     4         mItemCount = (TextView) findViewById(R.id.item_count);
     5         mListView.setOnItemClickListener(this);
     6         String apkRoot = "chmod 777 " + getPackageCodePath(); 
     7         RootCommand(apkRoot);
     8         File folder = new File("/");
     9         initData(folder);
    10     }

    修改Root权限的方法:

     1 public static boolean RootCommand (String command) {
     2         Process process = null;
     3         DataOutputStream os = null;
     4         try {
     5             process = Runtime.getRuntime().exec("su");
     6             os = new DataOutputStream(process.getOutputStream());
     7             os.writeBytes(command + "\n");
     8             os.writeBytes("exit\n");
     9             os.flush();
    10             process.waitFor();
    11         }
    12         catch (Exception e) {
    13             return false;
    14         }
    15         finally {
    16             try {
    17                 if (os != null) {
    18                     os.close();
    19                 }
    20                 process.destroy();
    21             }
    22             catch (Exception e) {
    23                 e.printStackTrace();
    24             }
    25         }
    26         return true;
    27     }

    完了之后我们要获取根目录下面的所有的数据,然后设置到我们的ListView中让它显示出来。

     1  private void initData(File folder) {
     2         boolean isRoot = folder.getParent() == null; 
     3         mPathView.setText(folder.getAbsolutePath());  
     4         ArrayList<File> files = new ArrayList<File>();   
     5         if (!isRoot) {
     6             files.add(folder.getParentFile());  
     7         }
     8         File[] filterFiles = folder.listFiles();  
     9         mItemCount.setText(filterFiles.length + "项"); 
    10         if (null != filterFiles && filterFiles.length > 0) {
    11             for (File file : filterFiles) {
    12                 files.add(file);
    13             }
    14         }
    15         mFileAdpter = new FileListAdapter(this, files, isRoot);  
    16         mListView.setAdapter(mFileAdpter);
    17     }

    首先是获取当前是否是根目录,然后把文件的路径设置给我们要显示的View。

    然后用一个ArrayList来装我们目录下的所有的文件或者文件夹。

    首先要把这个文件夹的父类装到我们的列表中去,然后把这个文件夹下的子文件都拿到,也装在列表中,然后调用Adapter显示出来。既然说到了Adapter, 那就看下Adapter吧。

     1 private class FileListAdapter extends BaseAdapter {
     2 
     3         private Context context;
     4         private ArrayList<File> files;
     5         private boolean isRoot;
     6         private LayoutInflater mInflater;
     7         
     8         public FileListAdapter (Context context, ArrayList<File> files, boolean isRoot) {
     9             this.context = context;
    10             this.files = files;
    11             this.isRoot = isRoot;
    12             mInflater = LayoutInflater.from(context);
    13         }
    14         
    15         @Override
    16         public int getCount () {
    17             return files.size();
    18         }
    19 
    20         @Override
    21         public Object getItem (int position) {
    22             return files.get(position);
    23         }
    24 
    25         @Override
    26         public long getItemId (int position) {
    27             return position;
    28         }
    29         
    30         @Override
    31         public View getView (int position, View convertView, ViewGroup parent) {
    32             ViewHolder viewHolder;
    33             if(convertView == null) {
    34                 viewHolder = new ViewHolder();
    35                 convertView = mInflater.inflate(R.layout.file_list_item, null);
    36                 convertView.setTag(viewHolder);
    37                 viewHolder.title = (TextView) convertView.findViewById(R.id.file_title);
    38                 viewHolder.type = (TextView) convertView.findViewById(R.id.file_type);
    39                 viewHolder.data = (TextView) convertView.findViewById(R.id.file_date);
    40                 viewHolder.size = (TextView) convertView.findViewById(R.id.file_size);
    41             } else {
    42                 viewHolder = (ViewHolder) convertView.getTag();
    43             }
    44             
    45             File file = (File) getItem(position);
    46             if(position == 0 && !isRoot) {
    47                 viewHolder.title.setText("返回上一级");
    48                 viewHolder.data.setVisibility(View.GONE);
    49                 viewHolder.size.setVisibility(View.GONE);
    50                 viewHolder.type.setVisibility(View.GONE);
    51             } else {
    52                 String fileName = file.getName();
    53                 viewHolder.title.setText(fileName);
    54                 if(file.isDirectory()) {
    55                     viewHolder.size.setText("文件夹");
    56                     viewHolder.size.setTextColor(Color.RED);
    57                     viewHolder.type.setVisibility(View.GONE);
    58                     viewHolder.data.setVisibility(View.GONE);
    59                 } else {
    60                     long fileSize = file.length();
    61                     if(fileSize > 1024*1024) {
    62                         float size = fileSize /(1024f*1024f);
    63                         viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "MB");
    64                     } else if(fileSize >= 1024) {
    65                         float size = fileSize/1024;
    66                         viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "KB");
    67                     } else {
    68                         viewHolder.size.setText(fileSize + "B");
    69                     }
    70                     int dot = fileName.indexOf('.');
    71                     if(dot > -1 && dot < (fileName.length() -1)) {
    72                         viewHolder.type.setText(fileName.substring(dot + 1) + "文件");
    73                     }
    74                     viewHolder.data.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(file.lastModified()));
    75                 }
    76             }
    77             return convertView;
    78         }
    79         
    80         class ViewHolder {
    81             private TextView title;
    82             private TextView type;
    83             private TextView data;
    84             private TextView size;
    85         }
    86     }

     看下adapter的布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <TextView 
               android:id="@+id/file_title"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:textSize="25sp"
               android:textColor="#fff000"/>
        <LinearLayout 
            android:id="@+id/file_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView 
                android:id="@+id/file_size"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:textColor="#ffffcc"
                android:layout_weight="1"
                android:textSize="18sp"/>
            
            <TextView 
                android:id="@+id/file_type"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:textColor="#ffffcc"
                android:layout_weight="1"
                android:gravity="right"
                android:textSize="18sp"/>
            <TextView 
                android:id="@+id/file_date"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:textColor="#ffffff"
                android:layout_weight="1"
                android:gravity="right"
                android:textSize="18sp"/>
        </LinearLayout>
    </LinearLayout>

    列表的Item项分2行显示,上面一行显示文件名

    下面一行分别显示文件大小,文件类型,文件修改时间。

    我们可以通过File file = (File) getItem(position);拿到Item项的文件,如果是在第一个并且不再根目录我们就把第一个也就是parentFile显示为:“返回上一级”,下一行的都隐藏掉。

    如果不是第一个位置,可以拿到这个文件的一系列信息。

    先把String fileName = file.getName();文件名拿到,显示出来。

    如果这个文件是一个文件夹,就把文件的大小显示为“文件夹”,类型和修改时间隐藏掉。

    如果不是一个文件夹, 可以拿到文件的长度long fileSize = file.length();

    根据特定的长度显示文件的大小,B, KB, MB, GB等。

    然后拿到文件的类型,通过最后一个“.”之后的字符串就是该文件的类型。

    通过viewHolder.data.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(file.lastModified())); 设置文件的最近修改时间。

    然后可以设置每个Item项的点击事件,如下所示:

     1  @Override
     2     public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
     3         File file = (File) mFileAdpter.getItem(position);
     4         if(!file.canRead()) {
     5             new AlertDialog.Builder(this).setTitle("提示").setMessage("权限不足").setPositiveButton(android.R.string.ok, new OnClickListener() {
     6                 
     7                 @Override
     8                 public void onClick (DialogInterface dialog, int which) {
     9                     
    10                 }
    11             }).show();
    12         } else if(file.isDirectory()) {
    13             initData(file);
    14         } else {
    15             openFile(file);
    16         }
    17     }

    如果这个文件不能读,就弹出对话框显示“权限不足”。

    如果是一个文件夹,就在调用一次显示所有文件的方法:initData(file);把这个文件夹作为参数传递下去。

    如果是一个文件,就可以调用打开文件的方法打开这个文件。

    如何打开文件呢?

    可以根据不同的文件的后缀名找到不同的文件类型:

    可以用一个二维数组把一些常用的文件类型封装起来。如下:

     1  private final String[][] MIME_MapTable = {
     2         // {后缀名, MIME类型}
     3         { ".3gp", "video/3gpp" }, 
     4         { ".apk", "application/vnd.android.package-archive" }, 
     5         { ".asf", "video/x-ms-asf" }, 
     6         { ".avi", "video/x-msvideo" },
     7         { ".bin", "application/octet-stream" }, 
     8         { ".bmp", "image/bmp" }, 
     9         { ".c", "text/plain" }, 
    10         { ".class", "application/octet-stream" },
    11         { ".conf", "text/plain" }, 
    12         { ".cpp", "text/plain" }, 
    13         { ".doc", "application/msword" },
    14         { ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, 
    15         { ".xls", "application/vnd.ms-excel" },
    16         { ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, 
    17         { ".exe", "application/octet-stream" },
    18         { ".gif", "image/gif" }, 
    19         { ".gtar", "application/x-gtar" }, 
    20         { ".gz", "application/x-gzip" }, 
    21         { ".h", "text/plain" }, 
    22         { ".htm", "text/html" },
    23         { ".html", "text/html" }, 
    24         { ".jar", "application/java-archive" }, 
    25         { ".java", "text/plain" }, 
    26         { ".jpeg", "image/jpeg" },
    27         { ".jpg", "image/jpeg" }, 
    28         { ".js", "application/x-javascript" }, 
    29         { ".log", "text/plain" }, 
    30         { ".m3u", "audio/x-mpegurl" },
    31         { ".m4a", "audio/mp4a-latm" }, 
    32         { ".m4b", "audio/mp4a-latm" }, 
    33         { ".m4p", "audio/mp4a-latm" }, 
    34         { ".m4u", "video/vnd.mpegurl" },
    35         { ".m4v", "video/x-m4v" }, 
    36         { ".mov", "video/quicktime" }, 
    37         { ".mp2", "audio/x-mpeg" }, 
    38         { ".mp3", "audio/x-mpeg" }, 
    39         { ".mp4", "video/mp4" },
    40         { ".mpc", "application/vnd.mpohun.certificate" }, 
    41         { ".mpe", "video/mpeg" }, 
    42         { ".mpeg", "video/mpeg" }, 
    43         { ".mpg", "video/mpeg" },
    44         { ".mpg4", "video/mp4" }, 
    45         { ".mpga", "audio/mpeg" }, 
    46         { ".msg", "application/vnd.ms-outlook" }, 
    47         { ".ogg", "audio/ogg" },
    48         { ".pdf", "application/pdf" }, 
    49         { ".png", "image/png" }, 
    50         { ".pps", "application/vnd.ms-powerpoint" },
    51         { ".ppt", "application/vnd.ms-powerpoint" }, 
    52         { ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
    53         { ".prop", "text/plain" }, 
    54         { ".rc", "text/plain" }, 
    55         { ".rmvb", "audio/x-pn-realaudio" }, 
    56         { ".rtf", "application/rtf" },
    57         { ".sh", "text/plain" }, 
    58         { ".tar", "application/x-tar" }, 
    59         { ".tgz", "application/x-compressed" }, 
    60         { ".txt", "text/plain" },
    61         { ".wav", "audio/x-wav" }, 
    62         { ".wma", "audio/x-ms-wma" }, 
    63         { ".wmv", "audio/x-ms-wmv" }, 
    64         { ".wps", "application/vnd.ms-works" },
    65         { ".xml", "text/plain" }, 
    66         { ".z", "application/x-compress" }, 
    67         { ".zip", "application/x-zip-compressed" }, 
    68         { "", "*/*" } 
    69         };

    分别对应的是后缀名和对应的文件类型。

    我们可以根据文件的后缀名拿到文件的MIMEType类型:

     1 private String getMIMEType(File file) {
     2         String type = "*/*";
     3         String fileName = file.getName();
     4         int dotIndex = fileName.indexOf('.');
     5         if(dotIndex < 0) {
     6             return type;
     7         }
     8         String end = fileName.substring(dotIndex, fileName.length()).toLowerCase();
     9         if(end == "") {
    10             return type;
    11         }
    12         for(int i=0; i<MIME_MapTable.length; i++) {
    13             if(end == MIME_MapTable[i][0]) {
    14                 type = MIME_MapTable[i][1] ;
    15             }
    16         }
    17         return type;
    18     }

    先遍历后缀名,如果找到,就把对应的类型找到并返回。

    拿到了类型,就可以打开这个文件。

    用这个intent.setDataAndType(Uri.fromFile(file), type); 打开设置打开文件的类型。

    如果type是*/*会弹出所有的可供选择的应用程序。

    到这里一个简易的文件管理器就成型了。。。

    源代码:

      1 package com.android.test;
      2 
      3 import java.io.DataOutputStream;
      4 import java.io.File;
      5 import java.text.DecimalFormat;
      6 import java.text.SimpleDateFormat;
      7 import java.util.ArrayList;
      8 
      9 import android.app.Activity;
     10 import android.app.AlertDialog;
     11 import android.content.Context;
     12 import android.content.DialogInterface;
     13 import android.content.Intent;
     14 import android.content.DialogInterface.OnClickListener;
     15 import android.graphics.Color;
     16 import android.net.Uri;
     17 import android.os.Bundle;
     18 import android.view.LayoutInflater;
     19 import android.view.View;
     20 import android.view.ViewGroup;
     21 import android.widget.AdapterView;
     22 import android.widget.AdapterView.OnItemClickListener;
     23 import android.widget.BaseAdapter;
     24 import android.widget.ListView;
     25 import android.widget.TextView;
     26 import android.widget.Toast;
     27 
     28 public class FileManager extends Activity implements OnItemClickListener {
     29     
     30     private ListView mListView;
     31     private TextView mPathView;
     32     private FileListAdapter mFileAdpter;
     33     private TextView mItemCount;
     34     
     35     @Override
     36     protected void onCreate (Bundle savedInstanceState) {
     37         super.onCreate(savedInstanceState);
     38         setContentView(R.layout.file_manager);
     39         initView();
     40     }
     41     
     42     private void initView() {
     43         mListView = (ListView) findViewById(R.id.file_list);
     44         mPathView = (TextView) findViewById(R.id.path);
     45         mItemCount = (TextView) findViewById(R.id.item_count);
     46         mListView.setOnItemClickListener(this);
     47         String apkRoot = "chmod 777 " + getPackageCodePath(); 
     48         RootCommand(apkRoot);
     49         File folder = new File("/");
     50         initData(folder);
     51     }
     52     
     53     public static boolean RootCommand (String command) {
     54         Process process = null;
     55         DataOutputStream os = null;
     56         try {
     57             process = Runtime.getRuntime().exec("su");
     58             os = new DataOutputStream(process.getOutputStream());
     59             os.writeBytes(command + "\n");
     60             os.writeBytes("exit\n");
     61             os.flush();
     62             process.waitFor();
     63         }
     64         catch (Exception e) {
     65             return false;
     66         }
     67         finally {
     68             try {
     69                 if (os != null) {
     70                     os.close();
     71                 }
     72                 process.destroy();
     73             }
     74             catch (Exception e) {
     75                 e.printStackTrace();
     76             }
     77         }
     78         return true;
     79     }
     80     
     81     private void initData(File folder) {
     82         boolean isRoot = folder.getParent() == null; 
     83         mPathView.setText(folder.getAbsolutePath());  
     84         ArrayList<File> files = new ArrayList<File>();   
     85         if (!isRoot) {
     86             files.add(folder.getParentFile());  
     87         }
     88         File[] filterFiles = folder.listFiles();  
     89         mItemCount.setText(filterFiles.length + "项"); 
     90         if (null != filterFiles && filterFiles.length > 0) {
     91             for (File file : filterFiles) {
     92                 files.add(file);
     93             }
     94         }
     95         mFileAdpter = new FileListAdapter(this, files, isRoot);  
     96         mListView.setAdapter(mFileAdpter);
     97     }
     98     
     99     private class FileListAdapter extends BaseAdapter {
    100 
    101         private Context context;
    102         private ArrayList<File> files;
    103         private boolean isRoot;
    104         private LayoutInflater mInflater;
    105         
    106         public FileListAdapter (Context context, ArrayList<File> files, boolean isRoot) {
    107             this.context = context;
    108             this.files = files;
    109             this.isRoot = isRoot;
    110             mInflater = LayoutInflater.from(context);
    111         }
    112         
    113         @Override
    114         public int getCount () {
    115             return files.size();
    116         }
    117 
    118         @Override
    119         public Object getItem (int position) {
    120             return files.get(position);
    121         }
    122 
    123         @Override
    124         public long getItemId (int position) {
    125             return position;
    126         }
    127         
    128         @Override
    129         public View getView (int position, View convertView, ViewGroup parent) {
    130             ViewHolder viewHolder;
    131             if(convertView == null) {
    132                 viewHolder = new ViewHolder();
    133                 convertView = mInflater.inflate(R.layout.file_list_item, null);
    134                 convertView.setTag(viewHolder);
    135                 viewHolder.title = (TextView) convertView.findViewById(R.id.file_title);
    136                 viewHolder.type = (TextView) convertView.findViewById(R.id.file_type);
    137                 viewHolder.data = (TextView) convertView.findViewById(R.id.file_date);
    138                 viewHolder.size = (TextView) convertView.findViewById(R.id.file_size);
    139             } else {
    140                 viewHolder = (ViewHolder) convertView.getTag();
    141             }
    142             
    143             File file = (File) getItem(position);
    144             if(position == 0 && !isRoot) {
    145                 viewHolder.title.setText("返回上一级");
    146                 viewHolder.data.setVisibility(View.GONE);
    147                 viewHolder.size.setVisibility(View.GONE);
    148                 viewHolder.type.setVisibility(View.GONE);
    149             } else {
    150                 String fileName = file.getName();
    151                 viewHolder.title.setText(fileName);
    152                 if(file.isDirectory()) {
    153                     viewHolder.size.setText("文件夹");
    154                     viewHolder.size.setTextColor(Color.RED);
    155                     viewHolder.type.setVisibility(View.GONE);
    156                     viewHolder.data.setVisibility(View.GONE);
    157                 } else {
    158                     long fileSize = file.length();
    159                     if(fileSize > 1024*1024) {
    160                         float size = fileSize /(1024f*1024f);
    161                         viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "MB");
    162                     } else if(fileSize >= 1024) {
    163                         float size = fileSize/1024;
    164                         viewHolder.size.setText(new DecimalFormat("#.00").format(size) + "KB");
    165                     } else {
    166                         viewHolder.size.setText(fileSize + "B");
    167                     }
    168                     int dot = fileName.indexOf('.');
    169                     if(dot > -1 && dot < (fileName.length() -1)) {
    170                         viewHolder.type.setText(fileName.substring(dot + 1) + "文件");
    171                     }
    172                     viewHolder.data.setText(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(file.lastModified()));
    173                 }
    174             }
    175             return convertView;
    176         }
    177         
    178         class ViewHolder {
    179             private TextView title;
    180             private TextView type;
    181             private TextView data;
    182             private TextView size;
    183         }
    184     }
    185 
    186     @Override
    187     public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
    188         File file = (File) mFileAdpter.getItem(position);
    189         if(!file.canRead()) {
    190             new AlertDialog.Builder(this).setTitle("提示").setMessage("权限不足").setPositiveButton(android.R.string.ok, new OnClickListener() {
    191                 
    192                 @Override
    193                 public void onClick (DialogInterface dialog, int which) {
    194                     
    195                 }
    196             }).show();
    197         } else if(file.isDirectory()) {
    198             initData(file);
    199         } else {
    200             openFile(file);
    201         }
    202     }
    203     
    204     private void openFile(File file) {
    205         Intent intent = new Intent();
    206         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    207         intent.setAction(Intent.ACTION_VIEW);  
    208         String type = getMIMEType(file);  
    209         intent.setDataAndType(Uri.fromFile(file), type);  
    210         try {
    211             startActivity(intent);
    212         }
    213         catch (Exception e) {
    214             Toast.makeText(this, "未知类型,不能打开", Toast.LENGTH_SHORT).show();
    215         }
    216     }
    217     
    218     private String getMIMEType(File file) {
    219         String type = "*/*";
    220         String fileName = file.getName();
    221         int dotIndex = fileName.indexOf('.');
    222         if(dotIndex < 0) {
    223             return type;
    224         }
    225         String end = fileName.substring(dotIndex, fileName.length()).toLowerCase();
    226         if(end == "") {
    227             return type;
    228         }
    229         for(int i=0; i<MIME_MapTable.length; i++) {
    230             if(end == MIME_MapTable[i][0]) {
    231                 type = MIME_MapTable[i][1] ;
    232             }
    233         }
    234         return type;
    235     }
    236     
    237     private final String[][] MIME_MapTable = {
    238         // {后缀名, MIME类型}
    239         { ".3gp", "video/3gpp" }, 
    240         { ".apk", "application/vnd.android.package-archive" }, 
    241         { ".asf", "video/x-ms-asf" }, 
    242         { ".avi", "video/x-msvideo" },
    243         { ".bin", "application/octet-stream" }, 
    244         { ".bmp", "image/bmp" }, 
    245         { ".c", "text/plain" }, 
    246         { ".class", "application/octet-stream" },
    247         { ".conf", "text/plain" }, 
    248         { ".cpp", "text/plain" }, 
    249         { ".doc", "application/msword" },
    250         { ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, 
    251         { ".xls", "application/vnd.ms-excel" },
    252         { ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, 
    253         { ".exe", "application/octet-stream" },
    254         { ".gif", "image/gif" }, 
    255         { ".gtar", "application/x-gtar" }, 
    256         { ".gz", "application/x-gzip" }, 
    257         { ".h", "text/plain" }, 
    258         { ".htm", "text/html" },
    259         { ".html", "text/html" }, 
    260         { ".jar", "application/java-archive" }, 
    261         { ".java", "text/plain" }, 
    262         { ".jpeg", "image/jpeg" },
    263         { ".jpg", "image/jpeg" }, 
    264         { ".js", "application/x-javascript" }, 
    265         { ".log", "text/plain" }, 
    266         { ".m3u", "audio/x-mpegurl" },
    267         { ".m4a", "audio/mp4a-latm" }, 
    268         { ".m4b", "audio/mp4a-latm" }, 
    269         { ".m4p", "audio/mp4a-latm" }, 
    270         { ".m4u", "video/vnd.mpegurl" },
    271         { ".m4v", "video/x-m4v" }, 
    272         { ".mov", "video/quicktime" }, 
    273         { ".mp2", "audio/x-mpeg" }, 
    274         { ".mp3", "audio/x-mpeg" }, 
    275         { ".mp4", "video/mp4" },
    276         { ".mpc", "application/vnd.mpohun.certificate" }, 
    277         { ".mpe", "video/mpeg" }, 
    278         { ".mpeg", "video/mpeg" }, 
    279         { ".mpg", "video/mpeg" },
    280         { ".mpg4", "video/mp4" }, 
    281         { ".mpga", "audio/mpeg" }, 
    282         { ".msg", "application/vnd.ms-outlook" }, 
    283         { ".ogg", "audio/ogg" },
    284         { ".pdf", "application/pdf" }, 
    285         { ".png", "image/png" }, 
    286         { ".pps", "application/vnd.ms-powerpoint" },
    287         { ".ppt", "application/vnd.ms-powerpoint" }, 
    288         { ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
    289         { ".prop", "text/plain" }, 
    290         { ".rc", "text/plain" }, 
    291         { ".rmvb", "audio/x-pn-realaudio" }, 
    292         { ".rtf", "application/rtf" },
    293         { ".sh", "text/plain" }, 
    294         { ".tar", "application/x-tar" }, 
    295         { ".tgz", "application/x-compressed" }, 
    296         { ".txt", "text/plain" },
    297         { ".wav", "audio/x-wav" }, 
    298         { ".wma", "audio/x-ms-wma" }, 
    299         { ".wmv", "audio/x-ms-wmv" }, 
    300         { ".wps", "application/vnd.ms-works" },
    301         { ".xml", "text/plain" }, 
    302         { ".z", "application/x-compress" }, 
    303         { ".zip", "application/x-zip-compressed" }, 
    304         { "", "*/*" } 
    305         };
    306 }

      最后补充一下,布局文件中的dimension是编译到jar包里面去了的,没有jar包的童鞋可以改成自己定义大小。。

  • 相关阅读:
    POJ 2236
    HDU 6027
    FZU 2278
    FZU 2282
    python之----------字符编码的原理
    python可变数据类型和不可变数据类型
    python的运算符和while循环
    python之字符串的切片
    python数据类型补充
    python的数据类型
  • 原文地址:https://www.cnblogs.com/shang53880/p/2574806.html
Copyright © 2011-2022 走看看