本應用能夠瀏覽手機本地的文件和文件夾,而且可根據用戶需求對用戶指定的文件進行操做。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你還有什麼不懂的,能夠在如下評論地區給我留言哦。