• android简易文件管理器


    eclipse下新建一个android工程:FileExplore,并在包下面建立FileExploreActivity;

    其中代码如下:

      1 package zcw.softs;
    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 import java.util.List;
    9
    10 import android.app.AlertDialog;
    11 import android.app.ListActivity;
    12 import android.content.Context;
    13 import android.content.DialogInterface;
    14 import android.content.Intent;
    15 import android.graphics.Color;
    16 import android.net.Uri;
    17 import android.os.Bundle;
    18 import android.util.Log;
    19 import android.view.KeyEvent;
    20 import android.view.LayoutInflater;
    21 import android.view.View;
    22 import android.view.ViewGroup;
    23 import android.widget.ArrayAdapter;
    24 import android.widget.LinearLayout;
    25 import android.widget.ListView;
    26 import android.widget.TextView;
    27
    28 public class FileExploreActivity extends ListActivity {
    29 private TextView currentFolder,countItems; //当前文件夹
    30 private FileListAdapter fileList;
    31
    32 //文件过滤器,查找文件夹或文本文件
    33 // private static final FileFilter BOOKS_FILTER = new FileFilter() {
    34 // public boolean accept(File f) {
    35 // return f.isDirectory() || f.getName().toLowerCase().matches("^.*?\\.(txt|text)$");
    36 // return true;
    37 // }
    38 // };
    39
    40 public void onCreate(Bundle savedInstanceState) {
    41 super.onCreate(savedInstanceState);
    42 setContentView(R.layout.fileexplore1);
    43 currentFolder = (TextView)findViewById(R.id.addbook_current_folder);
    44 countItems = (TextView)findViewById(R.id.itemcount);
    45
    46 String apkRoot = "chmod 777 " + getPackageCodePath();
    47 FileExploreActivity.RootCommand(apkRoot);
    48
    49 fill(new File("/"));
    50 }
    51
    52 public boolean onKeyDown(int keyCode, KeyEvent event) {
    53 if (keyCode == KeyEvent.KEYCODE_BACK && !fileList.isRoot) {
    54 fill(fileList.getItem(0));
    55 return true;
    56 }
    57 return super.onKeyDown(keyCode, event);
    58 }
    59 @Override
    60 protected void onListItemClick(ListView l, View v, int position, long id) {
    61 File file = fileList.getItem(position);
    62 if(!file.canRead())
    63 {
    64 /* 弹出AlertDialog显示权限不足 */
    65 new AlertDialog.Builder(this)
    66 .setTitle("Message")
    67 .setMessage("权限不足!")
    68 .setPositiveButton("OK",
    69 new DialogInterface.OnClickListener()
    70 {
    71 public void onClick(DialogInterface dialog,int which)
    72 {
    73 }
    74 }).show();
    75 }
    76 else if (file.isDirectory())
    77 fill(file);
    78 else
    79 {
    80 openFile(file);
    81 }
    82 }
    83 //跳转目录
    84 private void fill(File folder) {
    85 boolean isRoot = folder.getParent() == null;
    86 currentFolder.setText(folder.getAbsolutePath());
    87
    88 List<File> files = new ArrayList<File>();
    89 if (!isRoot)
    90 files.add(folder.getParentFile());
    91 File[] filterFiles = folder.listFiles();
    92 countItems.setText(filterFiles.length+"项");
    93 if(null != filterFiles && filterFiles.length>0) {
    94 for (File file : filterFiles) {
    95 files.add(file);
    96 }
    97 }
    98 fileList = new FileListAdapter(this,android.R.layout.simple_list_item_1, files, isRoot);
    99 setListAdapter(fileList);
    100 }
    101 public static boolean RootCommand(String command) {
    102 Process process = null;
    103 DataOutputStream os = null;
    104 try {
    105 process = Runtime.getRuntime().exec("su");
    106 os = new DataOutputStream(process.getOutputStream());
    107 os.writeBytes(command + "\n");
    108 os.writeBytes("exit\n");
    109 os.flush();
    110 process.waitFor();
    111 } catch (Exception e) {
    112 Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
    113 return false;
    114 } finally {
    115 try {
    116 if (os != null) {
    117 os.close();
    118 }
    119 process.destroy();
    120 } catch (Exception e) {
    121 }
    122 }
    123 Log.d("*** DEBUG ***", "Root SUC ");
    124 return true;
    125 }
    126 /**
    127 * 打开文件
    128 * @param file
    129 */
    130 private void openFile(File file){
    131
    132 Intent intent = new Intent();
    133 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    134 //设置intent的Action属性
    135 intent.setAction(Intent.ACTION_VIEW);
    136 //获取文件file的MIME类型
    137 String type = getMIMEType(file);
    138 //设置intent的data和Type属性。
    139 intent.setDataAndType(/*uri*/Uri.fromFile(file), type);
    140 //跳转
    141 try{
    142 startActivity(intent);
    143 }catch(Exception e){
    144 System.out.print("未知类型,不能打开\n");
    145 }
    146 }
    147
    148 /**
    149 * 根据文件后缀名获得对应的MIME类型。
    150 * @param file
    151 */
    152 private String getMIMEType(File file) {
    153
    154 String type="*/*";
    155 String fName = file.getName();
    156 //获取后缀名前的分隔符"."在fName中的位置。
    157 int dotIndex = fName.lastIndexOf(".");
    158 if(dotIndex < 0){
    159 return type;
    160 }
    161 /* 获取文件的后缀名 */
    162 String end=fName.substring(dotIndex,fName.length()).toLowerCase();
    163 if(end=="")return type;
    164 //在MIME和文件类型的匹配表中找到对应的MIME类型。
    165 for(int i=0;i<MIME_MapTable.length;i++){ //MIME_MapTable??在这里你一定有疑问,这个MIME_MapTable是什么?
    166 if(end.equals(MIME_MapTable[i][0]))
    167 type = MIME_MapTable[i][1];
    168 }
    169 return type;
    170 }
    171 private final String[][] MIME_MapTable={
    172 //{后缀名, MIME类型}
    173 {".3gp", "video/3gpp"},
    174 {".apk", "application/vnd.android.package-archive"},
    175 {".asf", "video/x-ms-asf"},
    176 {".avi", "video/x-msvideo"},
    177 {".bin", "application/octet-stream"},
    178 {".bmp", "image/bmp"},
    179 {".c", "text/plain"},
    180 {".class", "application/octet-stream"},
    181 {".conf", "text/plain"},
    182 {".cpp", "text/plain"},
    183 {".doc", "application/msword"},
    184 {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
    185 {".xls", "application/vnd.ms-excel"},
    186 {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
    187 {".exe", "application/octet-stream"},
    188 {".gif", "image/gif"},
    189 {".gtar", "application/x-gtar"},
    190 {".gz", "application/x-gzip"},
    191 {".h", "text/plain"},
    192 {".htm", "text/html"},
    193 {".html", "text/html"},
    194 {".jar", "application/java-archive"},
    195 {".java", "text/plain"},
    196 {".jpeg", "image/jpeg"},
    197 {".jpg", "image/jpeg"},
    198 {".js", "application/x-javascript"},
    199 {".log", "text/plain"},
    200 {".m3u", "audio/x-mpegurl"},
    201 {".m4a", "audio/mp4a-latm"},
    202 {".m4b", "audio/mp4a-latm"},
    203 {".m4p", "audio/mp4a-latm"},
    204 {".m4u", "video/vnd.mpegurl"},
    205 {".m4v", "video/x-m4v"},
    206 {".mov", "video/quicktime"},
    207 {".mp2", "audio/x-mpeg"},
    208 {".mp3", "audio/x-mpeg"},
    209 {".mp4", "video/mp4"},
    210 {".mpc", "application/vnd.mpohun.certificate"},
    211 {".mpe", "video/mpeg"},
    212 {".mpeg", "video/mpeg"},
    213 {".mpg", "video/mpeg"},
    214 {".mpg4", "video/mp4"},
    215 {".mpga", "audio/mpeg"},
    216 {".msg", "application/vnd.ms-outlook"},
    217 {".ogg", "audio/ogg"},
    218 {".pdf", "application/pdf"},
    219 {".png", "image/png"},
    220 {".pps", "application/vnd.ms-powerpoint"},
    221 {".ppt", "application/vnd.ms-powerpoint"},
    222 {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
    223 {".prop", "text/plain"},
    224 {".rc", "text/plain"},
    225 {".rmvb", "audio/x-pn-realaudio"},
    226 {".rtf", "application/rtf"},
    227 {".sh", "text/plain"},
    228 {".tar", "application/x-tar"},
    229 {".tgz", "application/x-compressed"},
    230 {".txt", "text/plain"},
    231 {".wav", "audio/x-wav"},
    232 {".wma", "audio/x-ms-wma"},
    233 {".wmv", "audio/x-ms-wmv"},
    234 {".wps", "application/vnd.ms-works"},
    235 {".xml", "text/plain"},
    236 {".z", "application/x-compress"},
    237 {".zip", "application/x-zip-compressed"},
    238 {"", "*/*"}
    239 };
    240 }
    241
    242 //文件列表适配器
    243 class FileListAdapter extends ArrayAdapter<File>{
    244 private LayoutInflater mInflater;
    245 boolean isRoot; //根目录
    246
    247 public FileListAdapter(Context context, int Resource, List<File> objects, boolean isRoot) {
    248 super(context,Resource,objects);
    249 this.isRoot = isRoot;
    250 this.mInflater = LayoutInflater.from(context);
    251 }
    252
    253 @Override
    254 public View getView(int position, View convertView, ViewGroup parent) {
    255 convertView = mInflater.inflate(R.layout.fileexplore2, null);
    256 TextView title = (TextView)convertView.findViewById(R.id.addbook_title);
    257 TextView file_size = (TextView)convertView.findViewById(R.id.file_size);
    258 TextView file_type = (TextView)convertView.findViewById(R.id.file_type);
    259 TextView file_date = (TextView)convertView.findViewById(R.id.file_edit_date);
    260
    261 File file = getItem(position);
    262 if (position == 0 && !isRoot)
    263 {
    264 title.setText("返回上层");
    265 title.setTextColor(Color.parseColor("#ffffff"));
    266 title.setTextSize(36);
    267 LinearLayout info= (LinearLayout)convertView.findViewById(R.id.file_info);
    268 info.setVisibility(View.GONE);
    269 }
    270 else {
    271 String filename=file.getName();
    272 title.setText(filename);
    273 if (file.isDirectory())
    274 {
    275 file_size.setText("文件夹");
    276 file_size.setTextColor(Color.parseColor("#FF0011"));
    277 }
    278 else {
    279 long fileSize = file.length();
    280 if(fileSize >= 1024*1024) {
    281 float size = fileSize/(1024f*1024f);
    282 file_size.setText(new DecimalFormat("#.00").format(size) + "MB");
    283 }else if(fileSize >= 1024) {
    284 float size = fileSize/1024f;
    285 file_size.setText(new DecimalFormat("#.00").format(size) + "KB");
    286 }else {
    287 file_size.setText(fileSize + "B");
    288 }
    289 int dot = filename.lastIndexOf('.');
    290 if ((dot >-1) && (dot < (filename.length() - 1))) {
    291 file_type.setText(filename.substring(dot + 1)+"文件");
    292 }
    293 file_date.setText(""+new SimpleDateFormat("yyyy/MM/dd HH:mm").format(file.lastModified()));
    294 }
    295 }
    296 return convertView;
    297 }
    298 }

    在layout文件夹下建立fileexplore1.xml作为listactivity的布局文件:

     1 <?xml version="1.0" encoding="utf-8"?>
    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3 android:orientation="vertical"
    4 android:layout_width="fill_parent"
    5 android:layout_height="fill_parent">
    6 <RelativeLayout
    7 android:id="@+id/relativeLayout1"
    8 android:layout_width="fill_parent"
    9 android:layout_height="wrap_content" >
    10
    11 <TextView
    12 android:id="@+id/addbook_current_folder"
    13 android:layout_width="wrap_content"
    14 android:layout_height="wrap_content"
    15 android:layout_alignParentLeft="true"
    16 android:layout_centerVertical="true"
    17 android:textColor="#FFFFCC"
    18 android:textSize="20sp" />
    19
    20 <TextView
    21 android:id="@+id/itemcount"
    22 android:layout_width="wrap_content"
    23 android:layout_height="wrap_content"
    24 android:textSize="20sp"
    25 android:textColor="#C22"
    26 android:layout_alignParentRight="true"
    27 android:layout_centerVertical="true"/>
    28
    29 </RelativeLayout>
    30 <LinearLayout
    31 android:id="@+id/linearLayout2"
    32 android:layout_width="fill_parent"
    33 android:layout_height="2dip"
    34 android:background="#09c"
    35 android:orientation="vertical" >
    36 </LinearLayout>
    37
    38 <LinearLayout
    39 android:id="@+id/linearLayout1"
    40 android:layout_width="fill_parent"
    41 android:layout_height="wrap_content"
    42 android:paddingLeft="8dip"
    43 android:paddingRight="8dip"
    44 android:orientation="vertical" >
    45 <ListView
    46 android:id="@android:id/list"
    47 android:layout_width="fill_parent"
    48 android:layout_height="wrap_content"
    49 android:layout_weight="1"
    50 android:cacheColorHint="#00000000"
    51 android:fadeScrollbars="true"
    52 android:drawSelectorOnTop="false"/>
    53 </LinearLayout>
    54 </LinearLayout>

    注意其中ListView的id一定要设置为android:id="@android:id/list" 否则listactivity不能识别listview而报错;

    在layout文件夹下建立fileexplore2.xmllistview的item的布局文件:

     1 <?xml version="1.0" encoding="utf-8"?>
    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3 android:layout_width="fill_parent"
    4 android:layout_height="wrap_content"
    5 android:orientation="vertical" >
    6
    7 <TextView
    8 android:id="@+id/addbook_title"
    9 android:layout_width="wrap_content"
    10 android:layout_height="wrap_content"
    11 android:textColor="#FFF000"
    12 android:textSize="20sp" />
    13
    14 <LinearLayout
    15 android:id="@+id/file_info"
    16 android:layout_width="fill_parent"
    17 android:layout_height="wrap_content" >
    18 <TextView
    19 android:id="@+id/file_size"
    20 android:layout_width="wrap_content"
    21 android:layout_height="wrap_content"
    22 android:textColor="#FFFFCC"
    23 android:layout_weight="1"
    24 android:textSize="10sp" />
    25 <TextView
    26 android:id="@+id/file_type"
    27 android:layout_width="wrap_content"
    28 android:layout_height="wrap_content"
    29 android:textColor="#FFFFCC"
    30 android:layout_weight="1"
    31 android:gravity="right"
    32 android:textSize="10sp" />
    33 <TextView
    34 android:id="@+id/file_edit_date"
    35 android:layout_width="wrap_content"
    36 android:layout_height="wrap_content"
    37 android:layout_weight="1"
    38 android:gravity="right"
    39 android:textColor="#FFFFCC"
    40 android:textSize="10sp" />
    41 </LinearLayout>
    42
    43 </LinearLayout>



    最后不要忘了在manifest中添加文件权限:

    <uses-permission android:name="android.permission.RESTART_PACKAGES" ></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>


    效果如下:

        






    原创文章欢迎转载,转载请注明出处:http://www.cnblogs.com/zhouchanwen
  • 相关阅读:
    onlyoffice 宋体显示问题排查
    【记录】shell脚本简写
    java 读取jar包内文件方法
    clickhouse升级
    grafana安装升级部署
    grafana新增插件
    ogg复制进程集成模式与经典模式之间切换
    ogg主库目录迁移
    goldengate从库目录迁移
    goldengate如何判断数据是否完成同步
  • 原文地址:https://www.cnblogs.com/zhouchanwen/p/2394175.html
Copyright © 2020-2023  润新知