模拟手机文件管理之查看与选择功能

Activity:

package com.example.zjc_file_choice.activity;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.example.zjc_file_choice.R;

import android.app.ListActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 文件选择不需要权限。该Activity可以选择文件,也可以打开文件
 * 
 * @author Zjc121327
 * @data 2015/02/06
 * 
 */
public class MyFileManagerActivity extends ListActivity {
    /** 文件名称集合 */
    private List<String> items = null;

    /** 文件绝对路径集合 */
    private List<String> paths = null;

    /** 根目录,路径 */
    private String rootPath;

    /** 当前目录,路径 */
    private TextView mPath;

    /** 文件选择的状态 :true为选择状态 */
    private boolean selectState = false;

    /** 选中文件的绝对路径集合 */
    private List<String> mSelectedFilePaths = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_file_manager);
        rootPath = SDCardFetchUtils.getSDCardPath() + "/";
        mPath = (TextView) findViewById(R.id.mPath);
        getFileDir(rootPath);
        getListView().setOnItemLongClickListener(longClickListener);
    }

    /**
     * 根据文件夹的绝对路径获取文件夹里面的文件
     * 
     * @param filePath
     *            文件夹的绝对路径
     */
    private void getFileDir(String filePath) {
        mPath.setText("存储目录:" + filePath);
        items = new ArrayList<String>();
        paths = new ArrayList<String>();
        File f = new File(filePath);
        if (!f.exists()) {
            f.mkdirs();
        }
        File[] files = f.listFiles();
        if (!filePath.equals(rootPath)) {
            items.add("b1");
            paths.add(rootPath);
            items.add("b2");
            paths.add(f.getParent());
        }
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
                items.add(file.getName());
                paths.add(file.getPath());
            }
        } else {
            Toast.makeText(getApplicationContext(), "该文件夹中没有文件",
                    Toast.LENGTH_LONG).show();
        }
        setListAdapter(new FileFolderAdapter(this, items, paths));
    }

    private OnItemLongClickListener longClickListener = new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
                int position, long id) {
            File file = new File(paths.get(position));
            if (!file.isDirectory()) {
                if (!mSelectedFilePaths.contains(paths.get(position))) {
                    mSelectedFilePaths.add(paths.get(position));
                    view.setBackgroundColor(getResources().getColor(
                            R.color.white_gray));
                    ImageView selected = (ImageView) view
                            .findViewById(R.id.selected);
                    selected.setVisibility(View.VISIBLE);
                    selectState = true;// 设置处于文件选择状态
                } else {
                    Toast.makeText(getApplicationContext(), "该文件已选择",
                            Toast.LENGTH_LONG).show();
                }
            } else {
                getFileDir(file.getAbsolutePath());
            }
            return true;
        }
    };

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        File file = new File(paths.get(position));
        // 不是文件选择状态时
        if (!selectState) {
            // 判断是否为文件夹
            if (file.isDirectory()) {
                getFileDir(paths.get(position));
            } else {
                openFile(file);
            }

        } else {
            if (!file.isDirectory()) {
                // 如果文件存在
                if (mSelectedFilePaths.contains(paths.get(position))) {
                    mSelectedFilePaths.remove(paths.get(position));
                    v.setBackgroundColor(getResources().getColor(R.color.white));
                    ImageView selected = (ImageView) v
                            .findViewById(R.id.selected);
                    selected.setVisibility(View.GONE);
                } else {// 如果不在
                    mSelectedFilePaths.add(paths.get(position));
                    v.setBackgroundColor(getResources().getColor(
                            R.color.white_gray));
                    ImageView selected = (ImageView) v
                            .findViewById(R.id.selected);
                    selected.setVisibility(View.VISIBLE);
                }
            } else {
                Toast.makeText(getApplicationContext(), "文件选择状态时,文件夹不能被选择",
                        Toast.LENGTH_LONG).show();
            }
        }

        if (mSelectedFilePaths.size() == 0) {
            // 取消选择状态
            selectState = false;
        }
    }

    /**
     * 打开文件
     * 
     * @param file
     *            被打开文件的绝对路径
     */
    private void openFile(File file) {
        // Uri uri = Uri.parse("file://"+file.getAbsolutePath());
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // 设置intent的Action属性
        intent.setAction(Intent.ACTION_VIEW);
        // 获取文件file的MIME类型
        String type = getMIMEType(file);
        // 设置intent的data和Type属性。
        intent.setDataAndType(/* uri */Uri.fromFile(file), type);
        // 跳转
        startActivity(intent);
    }

    /**
     * 根据文件后缀名获得对应的MIME类型。
     * 
     * @param file
     *            文件的绝对路径
     */
    private String getMIMEType(File file) {
        String type = "*/*";
        String fName = file.getName();
        // 获取后缀名前的分隔符"."在fName中的位置。
        int dotIndex = fName.lastIndexOf(".");
        if (dotIndex < 0) {
            return type;
        }
        /* 获取文件的后缀名 */
        String end = fName.substring(dotIndex, fName.length()).toLowerCase();
        if (end == "")
            return type;
        // 在MIME和文件类型的匹配表中找到对应的MIME类型。
        for (int i = 0; i < MIME_MapTable.length; i++) {
            if (end.equals(MIME_MapTable[i][0]))
                type = MIME_MapTable[i][1];
        }
        return type;
    }

    // 建立一个MIME类型与文件后缀名的匹配表
    private final String[][] MIME_MapTable = {
            // {后缀名, MIME类型}
            { ".3gp", "video/3gpp" },
            { ".apk", "application/vnd.android.package-archive" },
            { ".asf", "video/x-ms-asf" }, { ".avi", "video/x-msvideo" },
            { ".bin", "application/octet-stream" }, { ".bmp", "image/bmp" },
            { ".c", "text/plain" }, { ".class", "application/octet-stream" },
            { ".conf", "text/plain" }, { ".cpp", "text/plain" },
            { ".doc", "application/msword" },
            { ".exe", "application/octet-stream" }, { ".gif", "image/gif" },
            { ".gtar", "application/x-gtar" }, { ".gz", "application/x-gzip" },
            { ".h", "text/plain" }, { ".htm", "text/html" },
            { ".html", "text/html" }, { ".jar", "application/java-archive" },
            { ".java", "text/plain" }, { ".jpeg", "image/jpeg" },
            { ".jpg", "image/jpeg" }, { ".js", "application/x-javascript" },
            { ".log", "text/plain" }, { ".m3u", "audio/x-mpegurl" },
            { ".m4a", "audio/mp4a-latm" }, { ".m4b", "audio/mp4a-latm" },
            { ".m4p", "audio/mp4a-latm" }, { ".m4u", "video/vnd.mpegurl" },
            { ".m4v", "video/x-m4v" }, { ".mov", "video/quicktime" },
            { ".mp2", "audio/x-mpeg" }, { ".mp3", "audio/x-mpeg" },
            { ".mp4", "video/mp4" },
            { ".mpc", "application/vnd.mpohun.certificate" },
            { ".mpe", "video/mpeg" }, { ".mpeg", "video/mpeg" },
            { ".mpg", "video/mpeg" }, { ".mpg4", "video/mp4" },
            { ".mpga", "audio/mpeg" },
            { ".msg", "application/vnd.ms-outlook" }, { ".ogg", "audio/ogg" },
            { ".pdf", "application/pdf" }, { ".png", "image/png" },
            { ".pps", "application/vnd.ms-powerpoint" },
            { ".ppt", "application/vnd.ms-powerpoint" },
            { ".prop", "text/plain" },
            { ".rar", "application/x-rar-compressed" },
            { ".rc", "text/plain" }, { ".rmvb", "audio/x-pn-realaudio" },
            { ".rtf", "application/rtf" }, { ".sh", "text/plain" },
            { ".tar", "application/x-tar" },
            { ".tgz", "application/x-compressed" }, { ".txt", "text/plain" },
            { ".wav", "audio/x-wav" }, { ".wma", "audio/x-ms-wma" },
            { ".wmv", "audio/x-ms-wmv" },
            { ".wps", "application/vnd.ms-works" },
            // {".xml", "text/xml"},
            { ".xml", "text/plain" }, { ".z", "application/x-compress" },
            { ".zip", "application/zip" }, { "", "*/*" } };

}

Adapter:

package com.example.zjc_file_choice.activity;

import java.io.File;
import java.util.List;

import com.example.zjc_file_choice.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 显示文件(夹)适配器 文件选择适配器
 * 
 * @author Zjc
 * @data 2015/02/06
 * 
 */
public class FileFolderAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private Bitmap mIcon1;
    private Bitmap mIcon2;
    private Bitmap mIcon3;
    private Bitmap mIcon4;
    private List<String> items;
    private List<String> paths;

    public FileFolderAdapter(Context context, List<String> it, List<String> pa) {
        mInflater = LayoutInflater.from(context);
        items = it;
        paths = pa;
        mIcon1 = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.ic_back_dir);// 返回根目录
        mIcon2 = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.ic_back_up);// 返回上一层
        mIcon3 = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.ic_folder);// 文件夹
        mIcon4 = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.ic_doc);// 文件
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater
                    .inflate(R.layout.list_item_for_folder, null);
            holder = new ViewHolder();
            holder.text = (TextView) convertView.findViewById(R.id.text);
            holder.icon = (ImageView) convertView.findViewById(R.id.icon);
            holder.selected = (ImageView) convertView
                    .findViewById(R.id.selected);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        File f = new File(paths.get(position).toString());
        if (items.get(position).toString().equals("b1")) {
            holder.text.setText("返回根目录");
            holder.icon.setImageBitmap(mIcon1);
        } else if (items.get(position).toString().equals("b2")) {
            holder.text.setText("返回上一层");
            holder.icon.setImageBitmap(mIcon2);
        } else {
            holder.text.setText(f.getName());
            if (f.isDirectory()) {
                holder.icon.setImageBitmap(mIcon3);
            } else {
                holder.icon.setImageBitmap(mIcon4);
            }
        }
        return convertView;
    }

    private class ViewHolder {
        TextView text;
        ImageView icon;
        ImageView selected;
    }
}

XML文件:activity_file_manager.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/mPath"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:padding="5dp"
        android:background="@android:color/darker_gray"
        android:layout_alignParentTop="true"
        android:textColor="#00ff00"
        android:text="目录:"
        android:gravity="center_vertical"
        android:textSize="18sp" >
    </TextView>

    <ListView
        android:layout_below="@+id/mPath"
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:listSelector="#9e9e9e" >
    </ListView>

    <LinearLayout
        android:visibility="gone"
        android:layout_alignParentBottom="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:gravity="center"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/buttonConfirm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确定" />

        <Button
            android:id="@+id/buttonCancle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取消" />
    </LinearLayout>

</RelativeLayout>

XML文件:list_item_for_folder.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="45dp"
    android:background="#ffffff"
    android:orientation="horizontal" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="45dp"
        android:layout_gravity="center_vertical"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:padding="6dp" >

        <ImageView
            android:id="@+id/icon"
            android:layout_width="30dip"
            android:layout_height="30dip"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_gravity="center_vertical" >
        </ImageView>

        <TextView
            android:id="@+id/text"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:layout_toRightOf="@+id/icon"
            android:gravity="center_vertical"
            android:layout_centerVertical="true"
            android:textColor="#000000" >
        </TextView>

        <ImageView
            android:id="@+id/selected"
            android:layout_width="20dip"
            android:layout_height="20dip"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_gravity="center_vertical"
            android:src="@drawable/pictures_selected"
            android:visibility="gone" >
        </ImageView>
    </RelativeLayout>

</LinearLayout>

 

posted @ 2015-03-23 16:50  Zjc0514  阅读(237)  评论(0编辑  收藏  举报