Android 文件选择器详解及实例代码

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

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

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

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

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

       知识点一、 File 类的使用

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

       知识点二、调用方法说明  

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

       先贴上效果图如下:

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

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

Java代码

public class CopyOfFileChooserActivity extends Activity { 
   
  private String mSdcardRootPath ; //sdcard 根路径 
  private String mLastFilePath ;  //当前显示的路径 
   
  private ArrayList<FileInfo> mFileLists ; 
  private FileChooserAdapter mAdatper ; 
   
  //配置适配器 
  private void setGridViewAdapter(String filePath) { 
    updateFileItems(filePath); 
    mAdatper = new FileChooserAdapter(this , mFileLists); 
    mGridView.setAdapter(mAdatper); 
  } 
  //根据路径更新数据,并且通知Adatper数据改变 
  private void updateFileItems(String filePath) { 
    mLastFilePath = filePath ; 
    mTvPath.setText(mLastFilePath); 
     
    if(mFileLists == null) 
      mFileLists = new ArrayList<FileInfo>() ; 
    if(!mFileLists.isEmpty()) 
      mFileLists.clear() ; 
     
    File[] files = folderScan(filePath); 
    if(files == null)  
      return ; 
    for (int i = 0; i < files.length; i++) { 
      if(files[i].isHidden()) // 不显示隐藏文件 
        continue ; 
       
      String fileAbsolutePath = files[i].getAbsolutePath() ; 
      String fileName = files[i].getName(); 
      boolean isDirectory = false ; 
      if (files[i].isDirectory()){ 
        isDirectory = true ; 
      } 
      FileInfo fileInfo = new FileInfo(fileAbsolutePath , fileName , isDirectory) ; 
      //添加至列表 
      mFileLists.add(fileInfo); 
    } 
    //When first enter , the object of mAdatper don't initialized 
    if(mAdatper != null) 
      mAdatper.notifyDataSetChanged(); //重新刷新 
  } 
  //获得当前路径的所有文件 
  private File[] folderScan(String path) { 
    File file = new File(path); 
    File[] files = file.listFiles(); 
    return files; 
  } 
  private AdapterView.OnItemClickListener mItemClickListener = new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> adapterView, View view, int position, 
        long id) { 
      FileInfo fileInfo = (FileInfo)(((FileChooserAdapter)adapterView.getAdapter()).getItem(position)); 
      if(fileInfo.isDirectory())  //点击项为文件夹, 显示该文件夹下所有文件 
        updateFileItems(fileInfo.getFilePath()) ; 
      else if(fileInfo.isPPTFile()){ //是ppt文件 , 则将该路径通知给调用者 
        Intent intent = new Intent(); 
        intent.putExtra(EXTRA_FILE_CHOOSER, fileInfo.getFilePath()); 
        setResult(RESULT_OK , intent); 
        finish(); 
      } 
      else {  //其他文件..... 
        toast(getText(R.string.open_file_error_format)); 
      } 
    } 
  }; 
  public boolean onKeyDown(int keyCode , KeyEvent event){ 
    if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() 
      == KeyEvent.KEYCODE_BACK){ 
      backProcess();   
      return true ; 
    } 
    return super.onKeyDown(keyCode, event); 
  } 
  //返回上一层目录的操作 
  public void backProcess(){ 
    //判断当前路径是不是sdcard路径 , 如果不是,则返回到上一层。 
    if (!mLastFilePath.equals(mSdcardRootPath)) {  
      File thisFile = new File(mLastFilePath); 
      String parentFilePath = thisFile.getParent(); 
      updateFileItems(parentFilePath); 
    }  
    else {  //是sdcard路径 ,直接结束 
      setResult(RESULT_CANCELED); 
      finish(); 
    } 
  } 
} 

       此实例的界面稍显简陋,不过大家可以在此基础上完善,添加其他功能。本实例代码下载地址:

http://download.csdn.net/detail/qinjuning/4825392。

        感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!