您的位置:首页 > 移动开发 > Android开发

android 选择手机sdcard中的文件,获得其路径

2013-10-17 14:35 387 查看
package com.email.selectfile.adapter;

import java.util.ArrayList;

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

import com.email.R;

public class FileChooserAdapter extends BaseAdapter{

private ArrayList<FileInfo> mFileLists;
private LayoutInflater mLayoutInflater = null;

private static ArrayList<String> arrayList = new ArrayList<String>();

public FileChooserAdapter(Context context, ArrayList<FileInfo> fileLists) {
super();
mFileLists = fileLists;
mLayoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return mFileLists.size();
}

@Override
public FileInfo getItem(int position) {
// TODO Auto-generated method stub
return mFileLists.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = null;
ViewHolder holder = null;
if (convertView == null || convertView.getTag() == null) {
view = mLayoutInflater.inflate(R.layout.filechooser_gridview_item,
null);
holder = new ViewHolder(view);
view.setTag(holder);
} else {
view = convertView;
holder = (ViewHolder) convertView.getTag();
}

FileInfo fileInfo = getItem(position);
//TODO

holder.tvFileName.setText(fileInfo.getFileName());

if(fileInfo.isDirectory()){      //文件夹
holder.imgFileIcon.setImageResource(R.drawable.ic_folder);
holder.tvFileName.setTextColor(Color.GRAY);
}
else if(fileInfo.isPPTFile()){   //PPT文件
holder.imgFileIcon.setImageResource(R.drawable.ic_ppt);
holder.tvFileName.setTextColor(Color.RED);
}
else {                           //未知文件
holder.imgFileIcon.setImageResource(R.drawable.ic_file_unknown);
holder.tvFileName.setTextColor(Color.GRAY);
}
return view;
}

static class ViewHolder {
ImageView imgFileIcon;
TextView tvFileName;

public ViewHolder(View view) {
imgFileIcon = (ImageView) view.findViewById(R.id.imgFileIcon);
tvFileName = (TextView) view.findViewById(R.id.tvFileName);
}
}

enum FileType {
FILE , DIRECTORY;
}

// =========================
// Model
// =========================
public static class FileInfo {
private FileType fileType;
private String fileName;
private String filePath;

public FileInfo(String filePath, String fileName, boolean isDirectory) {
this.filePath = filePath;
this.fileName = fileName;
fileType = isDirectory ? FileType.DIRECTORY : FileType.FILE;
}

public boolean isPPTFile(){
if(fileName.lastIndexOf(".") < 0)  //Don't have the suffix
return false ;
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
if(!isDirectory() && arrayList.contains(fileSuffix))
return true ;
else
return false ;
}

public boolean isDirectory(){
if(fileType == FileType.DIRECTORY)
return true ;
else
return false ;
}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public String getFilePath() {
return filePath;
}

public void setFilePath(String filePath) {
this.filePath = filePath;
}

@Override
public String toString() {
return "FileInfo [fileType=" + fileType + ", fileName=" + fileName
+ ", filePath=" + filePath + "]";
}
}

}

----------------------------------------------------------------------------------------------------------------------------------------------------------------

package com.email.selectfile;

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

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.TextView;

import com.email.R;
import com.email.selectfile.adapter.FileChooserAdapter;
import com.email.selectfile.adapter.FileChooserAdapter.FileInfo;
import com.email.sendmail.SendEmailActivity;

public class FileChooserActivity extends Activity {

private GridView mGridView;
private View mBackView;
private View mBtExit;
private TextView mTvPath ;

private String mSdcardRootPath ;  //sdcard 根路径
private String mLastFilePath ;    //当前显示的路径

private ArrayList<FileInfo> mFileLists  ;
private FileChooserAdapter mAdatper ;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.filechooser_show);

mSdcardRootPath = Environment.getExternalStorageDirectory().getAbsolutePath();// �õ�sdcardĿ¼

mBackView = findViewById(R.id.imgBackFolder);
mBackView.setOnClickListener(mClickListener);
mBtExit = findViewById(R.id.btExit);
mBtExit.setOnClickListener(mClickListener);

mTvPath = (TextView)findViewById(R.id.tvPath);

mGridView = (GridView)findViewById(R.id.gvFileChooser);
mGridView.setEmptyView(findViewById(R.id.tvEmptyHint));
mGridView.setOnItemClickListener(mItemClickListener);
setGridViewAdapter(mSdcardRootPath);
}
//配置适配器
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 View.OnClickListener mClickListener = new  OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.imgBackFolder:
backProcess();
break;
case R.id.btExit :
setResult(RESULT_CANCELED);
finish();
break ;
default :
break ;
}
}
};

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{  //是文件 , 则将该路径通知给调用者
Intent intent = new Intent();
intent.putExtra(SendEmailActivity.EXTRA_FILE_CHOOSER , fileInfo.getFilePath());
setResult(RESULT_OK , intent);
finish();
}
}
};

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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android path