基於Android Studio2.1開發手機本地文件瀏覽器

本應用能夠瀏覽手機本地的文件和文件夾,而且可根據用戶需求對用戶指定的文件進行操做。html

本應用界面包含內容比較簡單,只有一個ListView,一個TextView和一個Button。android

ListView做用是顯示目錄下的文件或文件夾;TextView用於顯示當前路徑,Button用於返回上層目錄數組

 

如下是界面代碼:app

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.android.showfiles.MainActivity">
    <!--顯示當前路徑文本框-->
    <TextView
        android:id="@+id/path"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:gravity="center_horizontal"
        android:text="Hello World!" />
    <!--列出當前路徑下的全部文件的ListView-->
    <ListView
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/path"
        android:divider="#000"
        android:dividerHeight="1px" />

    <Button
        android:id="@+id/parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@android:drawable/ic_menu_revert" />
</RelativeLayout>

 

 

還有一個view是ListView適配器的模板:ide

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/icon" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/filename" />
</LinearLayout>

 

 

如下是Java代碼:工具

MainActivity代碼以下:ui

 

public class MainActivity extends AppCompatActivity {
    ListView listview;
    TextView textView;
    //記錄當前路徑下 的全部文件的數組
    File currentParent;
    //記錄當前路徑下的全部文件的文件數組
    File[] currentFiles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //獲取列出所有文件發ListView
        listview = (ListView) findViewById(R.id.list);
        textView = (TextView) findViewById(R.id.path);
        //獲取系統的SD卡目錄
        File root = new File("/mnt");
        //若是SD卡存在
        if (root.exists()) {
            currentParent = root;
            currentFiles = root.listFiles();//獲取root目錄下的全部文件
            //使用當前陸慕下的所有文件,文件夾來填充ListView
            inflateListView(currentFiles);
        }//if
        //爲ListView的列表項的單擊事件綁定監視器
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //用戶點擊了文件,則調用手機已安裝軟件操做該文件
                if (currentFiles[position].isFile()) {
                    Intent intent = OpenFile.openFile(currentFiles[position].getPath());
                    startActivity(intent);
                } else {
                    //獲取currentFiles[position]路徑下的全部文件
                    File[] tmp = currentFiles[position].listFiles();
                    if (tmp == null || tmp.length == 0) {
                        Toast.makeText(MainActivity.this, "空文件夾!", Toast.LENGTH_SHORT).show();
                    }//if
                    else {
                        //獲取用戶單擊的列表項對應的文件夾,設爲當前的父文件夾
                        currentParent = currentFiles[position];
                        //保存當前文件夾內的所有問價和文件夾
                        currentFiles = tmp;
                        inflateListView(currentFiles);
                    }//else
                }//else
            }//onItemClick
        });
        Button parent = (Button) findViewById(R.id.parent);
        parent.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                onbey();
            }//onClick
        });
    }//onCraete

    //返回上層菜單
    private void onbey() {
        try {
            if (!"/mnt".equals(currentParent.getCanonicalPath())) {
                //獲取上一層目錄
                currentParent = currentParent.getParentFile();
                //列出當前目錄下的全部文件
                currentFiles = currentParent.listFiles();
                //再次更新ListView
                inflateListView(currentFiles);
            }
            else{
                new AlertDialog.Builder(this)
                        .setIcon(R.mipmap.ic_launcher)
                        .setTitle("提示")
                        .setMessage("肯定要退出嗎?")
                        .setPositiveButton("肯定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                finish();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                            }
                        })
                        .create()
                        .show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }//catch
    }

    //更新列表
    private void inflateListView(File[] files) {
        if (files.length == 0)
            Toast.makeText(MainActivity.this, "sd卡不存在", Toast.LENGTH_SHORT).show();
        else {
            //建立一個List集合,List集合的元素是Map
            List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
            for (int i = 0; i < files.length; i++) {
                Map<String, Object> listItem = new HashMap<String, Object>();
                //若是當前File是文件夾,使用folder圖標;不然使用file圖標
                if (files[i].isDirectory()) listItem.put("icon", R.mipmap.folder1);
                    //else if(files[i].isFi)
                else listItem.put("icon", R.mipmap.file1);
                listItem.put("fileName", files[i].getName());
                //添加List項
                listItems.add(listItem);
            }//for
            //建立一個SimpleAdapter
            SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.mylist, new String[]{"icon", "fileName"},
                    new int[]{R.id.icon, R.id.filename});
            //位ListView設置Adpter
            listview.setAdapter(simpleAdapter);
            try {
                textView.setText("當前路徑爲:" + currentParent.getCanonicalPath());
            } catch (IOException e) {
                e.printStackTrace();
            }//catch
        }//esle
    }//inflateListView

    //監聽手機自帶返回鍵
    public void onBackPressed() {
        onbey();
    }

 

 

 

須要用到一個工具JAVA類(是JAVA類,不是基於Activity的類):this

 

public class OpenFile {

    public static Intent openFile(String filePath){

        File file = new File(filePath);
        if(!file.exists()) return null;
            /* 取得擴展名 */
        String end=file.getName().substring(file.getName().lastIndexOf(".") + 1,file.getName().length()).toLowerCase();
            /* 依擴展名的類型決定MimeType */
        if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")||
                end.equals("xmf")||end.equals("ogg")||end.equals("wav")){
            return getAudioFileIntent(filePath);
        }else if(end.equals("3gp")||end.equals("mp4")){
            return getAudioFileIntent(filePath);
        }else if(end.equals("jpg")||end.equals("gif")||end.equals("png")||
                end.equals("jpeg")||end.equals("bmp")){
            return getImageFileIntent(filePath);
        }else if(end.equals("apk")){
            return getApkFileIntent(filePath);
        }else if(end.equals("ppt")){
            return getPptFileIntent(filePath);
        }else if(end.equals("xls")){
            return getExcelFileIntent(filePath);
        }else if(end.equals("doc")){
            return getWordFileIntent(filePath);
        }else if(end.equals("pdf")){
            return getPdfFileIntent(filePath);
        }else if(end.equals("chm")){
            return getChmFileIntent(filePath);
        }else if(end.equals("txt")){
            return getTextFileIntent(filePath,false);
        }else{
            return getAllIntent(filePath);
        }
    }

    //Android獲取一個用於打開APK文件的intent
    public static Intent getAllIntent( String param ) {

        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(android.content.Intent.ACTION_VIEW);//動做
        Uri uri = Uri.fromFile(new File(param ));//轉換類型
        intent.setDataAndType(uri,"*/*");
        return intent;
    }
    //Android獲取一個用於打開APK文件的intent
    public static Intent getApkFileIntent( String param ) {

        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(android.content.Intent.ACTION_VIEW);
        Uri uri = Uri.fromFile(new File(param ));
        intent.setDataAndType(uri,"application/vnd.android.package-archive");
        return intent;
    }

    //Android獲取一個用於打開VIDEO文件的intent
    public static Intent getVideoFileIntent( String param ) {

        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(new File(param ));
        intent.setDataAndType(uri, "video/*");
        return intent;
    }

    //Android獲取一個用於打開AUDIO文件的intent
    public static Intent getAudioFileIntent( String param ){

        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(new File(param ));
        intent.setDataAndType(uri, "audio/*");
        return intent;
    }

    //Android獲取一個用於打開Html文件的intent
    public static Intent getHtmlFileIntent( String param ){

        Uri uri = Uri.parse(param ).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(param ).build();
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.setDataAndType(uri, "text/html");
        return intent;
    }

    //Android獲取一個用於打開圖片文件的intent
    public static Intent getImageFileIntent( String param ) {

        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(new File(param ));
        intent.setDataAndType(uri, "image/*");
        return intent;
    }

    //Android獲取一個用於打開PPT文件的intent
    public static Intent getPptFileIntent( String param ){

        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(new File(param ));
        intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
        return intent;
    }

    //Android獲取一個用於打開Excel文件的intent
    public static Intent getExcelFileIntent( String param ){

        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(new File(param ));
        intent.setDataAndType(uri, "application/vnd.ms-excel");
        return intent;
    }

    //Android獲取一個用於打開Word文件的intent
    public static Intent getWordFileIntent( String param ){

        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(new File(param ));
        intent.setDataAndType(uri, "application/msword");
        return intent;
    }

    //Android獲取一個用於打開CHM文件的intent
    public static Intent getChmFileIntent( String param ){

        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(new File(param ));
        intent.setDataAndType(uri, "application/x-chm");
        return intent;
    }

    //Android獲取一個用於打開文本文件的intent
    public static Intent getTextFileIntent( String param, boolean paramBoolean){

        Intent intent = new Intent("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (paramBoolean){
            Uri uri1 = Uri.parse(param );
            intent.setDataAndType(uri1, "text/plain");
        }else{
            Uri uri2 = Uri.fromFile(new File(param ));
            intent.setDataAndType(uri2, "text/plain");
        }
        return intent;
    }
    //Android獲取一個用於打開PDF文件的intent
    public static Intent getPdfFileIntent( String param ){

        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(new File(param ));
        intent.setDataAndType(uri, "application/pdf");
        return intent;
    }
}

 

 

要想獲取訪問本地文件的權限還要在AndroidManifest.xml文件中添加如下內容:excel

 

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

 

 

到此,完整的代碼以及思想已在上述文字中code

if你還有什麼不懂的,能夠在如下評論地區給我留言哦。

相關文章
相關標籤/搜索