本文给大家讲解下Android文件选择器的使用。实际上就是获取用户在SD卡中选择的文件或文件夹的路径,这很像C#中的OpenFileDialog控件。

       此实例的实现过程很简单,这样可以让大家快速的熟悉Android文件选择器,提高开发效率。

       网上曾经见到过一个关于文件选择器的实例,很多人都看过,本实例是根据它修改而成的,但更容易理解,效率也更高,另外,本实例有自己的特点:

       1、监听了用户按下Back键的事件,使其返回上一层目录。

       2、针对不同的文件类型(文件vs文件夹 , 目标文件vs其他文件)做了特殊处理。

       知识点一、 File 类的使用

       文件选择器的主要功能是:浏览文件\文件夹、文件类型等;都是通过Java File类来实现的。

       知识点二、调用方法说明   

       使用了startActivityForResult()发起调用以及onActivityResult()方法接收回调后的信息。

       先贴上效果图如下:

android 文件选择列表 安卓选择文件_选择器

       其他的也没什么好说了,大家看看代码注释吧,很简单。

       FileChooserActivity.java 实现文件选择的类 。

Java代码

  1. public class CopyOfFileChooserActivity extends Activity {  
  2.       
  3. private String mSdcardRootPath ;  //sdcard 根路径  
  4. private String mLastFilePath ;    //当前显示的路径  
  5.       
  6. private ArrayList<FileInfo> mFileLists  ;  
  7. private FileChooserAdapter mAdatper ;  
  8.       
  9. //配置适配器  
  10. private void setGridViewAdapter(String filePath) {  
  11.         updateFileItems(filePath);  
  12. new FileChooserAdapter(this , mFileLists);  
  13.         mGridView.setAdapter(mAdatper);  
  14.     }  
  15. //根据路径更新数据,并且通知Adatper数据改变  
  16. private void updateFileItems(String filePath) {  
  17.         mLastFilePath = filePath ;  
  18.         mTvPath.setText(mLastFilePath);  
  19.           
  20. if(mFileLists == null)  
  21. new ArrayList<FileInfo>() ;  
  22. if(!mFileLists.isEmpty())  
  23.             mFileLists.clear() ;  
  24.           
  25.         File[] files = folderScan(filePath);  
  26. if(files == null)   
  27. return ;  
  28. for (int i = 0; i < files.length; i++) {  
  29. if(files[i].isHidden())  // 不显示隐藏文件  
  30. continue ;  
  31.               
  32.             String fileAbsolutePath = files[i].getAbsolutePath() ;  
  33.             String fileName = files[i].getName();  
  34. boolean isDirectory = false ;  
  35. if (files[i].isDirectory()){  
  36. true ;  
  37.             }  
  38. new FileInfo(fileAbsolutePath , fileName , isDirectory) ;  
  39. //添加至列表  
  40.             mFileLists.add(fileInfo);  
  41.         }  
  42. //When first enter , the object of mAdatper don't initialized  
  43. if(mAdatper != null)  
  44. //重新刷新  
  45.     }  
  46. //获得当前路径的所有文件  
  47. private File[] folderScan(String path) {  
  48. new File(path);  
  49.         File[] files = file.listFiles();  
  50. return files;  
  51.     }  
  52. private AdapterView.OnItemClickListener mItemClickListener = new OnItemClickListener() {  
  53. public void onItemClick(AdapterView<?> adapterView, View view, int position,  
  54. long id) {  
  55.             FileInfo fileInfo = (FileInfo)(((FileChooserAdapter)adapterView.getAdapter()).getItem(position));  
  56. if(fileInfo.isDirectory())   //点击项为文件夹, 显示该文件夹下所有文件  
  57.                 updateFileItems(fileInfo.getFilePath()) ;  
  58. else if(fileInfo.isPPTFile()){  //是ppt文件 , 则将该路径通知给调用者  
  59. new Intent();  
  60.                 intent.putExtra(EXTRA_FILE_CHOOSER, fileInfo.getFilePath());  
  61.                 setResult(RESULT_OK , intent);  
  62.                 finish();  
  63.             }  
  64. else {   //其他文件.....  
  65.                 toast(getText(R.string.open_file_error_format));  
  66.             }  
  67.         }  
  68.     };  
  69. public boolean onKeyDown(int keyCode , KeyEvent event){  
  70. if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode()  
  71.             == KeyEvent.KEYCODE_BACK){  
  72.             backProcess();     
  73. return true ;  
  74.         }  
  75. return super.onKeyDown(keyCode, event);  
  76.     }  
  77. //返回上一层目录的操作  
  78. public void backProcess(){  
  79. //判断当前路径是不是sdcard路径 , 如果不是,则返回到上一层。  
  80. if (!mLastFilePath.equals(mSdcardRootPath)) {    
  81. new File(mLastFilePath);  
  82.             String parentFilePath = thisFile.getParent();  
  83.             updateFileItems(parentFilePath);  
  84.         }   
  85. else {   //是sdcard路径 ,直接结束  
  86.             setResult(RESULT_CANCELED);  
  87.             finish();  
  88.         }  
  89.     }  
  90. }  

       此实例的界面稍显简陋,不过大家可以在此基础上完善,添加其他功能。