android开发 文件分享到应用,Android应用中实现选择本地文件与目录的实例分享

文件选择器今天给大家分享下文件选择器的作用 , 具体就是获取用户在在SD卡选中的文件/文件夹路径 ,类似于C#中OpenFileDialog控件(对C#的一站式开发还是念念不忘)。功能实现起来比较简单,主要是帮助大家节省开发时间。

网上流传较广的一个成品如下 , 本文也是根据上面的成品修改而成,使其更易理解,效率更高。 除此之外,主要特色有:

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

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

知识点一、 File 类的使用

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

知识点二、调用方法说明

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

截图如下:

385cd4440d713ad2a6ae47d631e66c16.png

其他的也没什么好说了,大家看看代码注释吧~~  so easy  - - 。

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

public class CopyOfFileChooserActivity extends Activity {

private String mSdcardRootPath ; //sdcard 根路径

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

private ArrayList 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() ;

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();

}

}

}

界面依旧很丑陋,囧 ,大家可以根据需要在此基础上添加功能,下面选择目录也基本上同理。

目录选择器

64687b069bd6853c43d90b460d46caeb.png

45772737ed4ea0104af6f616cc962c3a.png

0331274a071a01b1a4e95781722aed47.png

33767c8a8e4dc4ccd720e4cb5e8de427.png

chooserdialog.xml

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="40dip">

android:layout_width="40dip"

android:layout_height="40dip"

android:text="HOME"

android:id="@+id/btn_home"

android:layout_gravity="left"

android:layout_weight="1"

/>

android:layout_height="35dip"

android:id="@+id/dir_layout"

android:gravity="center"

android:layout_weight="1">

android:layout_width="40dip"

android:layout_height="40dip"

android:text="BACK"

android:id="@+id/btn_back"

android:layout_gravity="right"

android:layout_weight="1"

/>

android:layout_width="fill_parent"

android:layout_height="300dip"

android:id="@+id/list_dir"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:id="@+id/btn_ok"

android:text="OK"/>

package hkp.dirchooser;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

import android.app.Dialog;

import android.content.Context;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.view.Gravity;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

public class DirChooserDialog extends Dialog implements android.view.View.OnClickListener{

private ListView list;

ArrayAdapter Adapter;

ArrayList arr=new ArrayList();

Context context;

private String path;

private TextView title;

private EditText et;

private Button home,back,ok;

private LinearLayout titleView;

private int type = 1;

private String[] fileType = null;

public final static int TypeOpen = 1;

public final static int TypeSave = 2;

/**

* @param context

* @param type 值为1表示创建打开目录类型的对话框,2为创建保存文件到目录类型的对话框

* @param fileType 要过滤的文件类型,null表示只选择目录

* @param resultPath 点OK按钮返回的结果,目录或者目录+文件名

*/

public DirChooserDialog(Context context,int type,String[]fileType,String resultPath) {

super(context);

// TODO Auto-generated constructor stub

this.context = context;

this.type = type;

this.fileType = fileType;

this.path = resultPath;

}

/* (non-Javadoc)

* @see android.app.Dialog#dismiss()

*/

@Override

public void dismiss() {

// TODO Auto-generated method stub

super.dismiss();

}

/* (non-Javadoc)

* @see android.app.Dialog#onCreate(android.os.Bundle)

*/

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.chooserdialog);

path = getRootDir();

arr = (ArrayList) getDirs(path);

Adapter = new ArrayAdapter(context,android.R.layout.simple_list_item_1, arr);

list = (ListView)findViewById(R.id.list_dir);

list.setAdapter(Adapter);

list.setOnItemClickListener(lvLis);

home = (Button) findViewById(R.id.btn_home);

home.setOnClickListener(this);

back = (Button) findViewById(R.id.btn_back);

back.setOnClickListener(this);

ok = (Button) findViewById(R.id.btn_ok);

ok.setOnClickListener(this);

titleView = (LinearLayout) findViewById(R.id.dir_layout);

if(type == TypeOpen){

title = new TextView(context);

titleView.addView(title);

title.setText(path);

}else if(type == TypeSave){

et = new EditText(context);

et.setWidth(240);

et.setHeight(70);

et.setGravity(Gravity.CENTER);

et.setPadding(0, 2, 0, 0);

titleView.addView(et);

et.setText("wfFileName");

}

// title = (TextView) findViewById(R.id.dir_str);

// title.setText(path);

}

//动态更新ListView

Runnable add=new Runnable(){

@Override

public void run() {

// TODO Auto-generated method stub

arr.clear();

//System.out.println("Runnable path:"+path);

//必须得用这种方法为arr赋值才能更新

List temp = getDirs(path);

for(int i = 0;i < temp.size();i++)

arr.add(temp.get(i));

Adapter.notifyDataSetChanged();

}

};

private OnItemClickListener lvLis=new OnItemClickListener(){

@Override

public void onItemClick(AdapterView> arg0, View arg1, int arg2,

long arg3) {

String temp = (String) arg0.getItemAtPosition(arg2);

//System.out.println("OnItemClick path1:"+path);

if(temp.equals(".."))

path = getSubDir(path);

else if(path.equals("/"))

path = path+temp;

else

path = path+"/"+temp;

//System.out.println("OnItemClick path2"+path);

if(type == TypeOpen)

title.setText(path);

Handler handler=new Handler();

handler.post(add);

}

};

private List getDirs(String ipath){

List file = new ArrayList();

//System.out.println("GetDirs path:"+ipath);

File[] myFile = new File(ipath).listFiles();

if(myFile == null){

file.add("..");

}else

for(File f: myFile){

//过滤目录

if(f.isDirectory()){

String tempf = f.toString();

int pos = tempf.lastIndexOf("/");

String subTemp = tempf.substring(pos+1, tempf.length());

// String subTemp = tempf.substring(path.length(),tempf.length());

file.add(subTemp);

//System.out.println("files in dir:"+subTemp);

}

//过滤知道类型的文件

if(f.isFile() && fileType != null){

for(int i = 0;i< fileType.length;i++){

int typeStrLen = fileType[i].length();

String fileName = f.getPath().substring(f.getPath().length()- typeStrLen);

if (fileName.toLowerCase().equals(fileType[i])) {

file.add(f.toString().substring(path.length()+1,f.toString().length()));

}

}

}

}

if(file.size()==0)

file.add("..");

// System.out.println("file[0]:"+file.get(0)+" File size:"+file.size());

return file;

}

/* (non-Javadoc)

* @see android.view.View.OnClickListener#onClick(android.view.View)

*/

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

if(v.getId() == home.getId()){

path = getRootDir();

if(type == TypeOpen)

title.setText(path);

Handler handler=new Handler();

handler.post(add);

}else if(v.getId() == back.getId()){

path = getSubDir(path);

if(type == TypeOpen)

title.setText(path);

Handler handler=new Handler();

handler.post(add);

}else if(v.getId() == ok.getId()){

dismiss();

if(type == TypeSave)

path = path+"/"+et.getEditableText().toString()+".wf";

Toast.makeText(context, path, Toast.LENGTH_SHORT).show();

}

}

private String getSDPath(){

File sdDir = null;

boolean sdCardExist = Environment.getExternalStorageState()

.equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在

if(sdCardExist)

{

sdDir = Environment.getExternalStorageDirectory();//获取根目录

}

if(sdDir == null){

//Toast.makeText(context, "No SDCard inside!",Toast.LENGTH_SHORT).show();

return null;

}

return sdDir.toString();

}

private String getRootDir(){

String root = "/";

path = getSDPath();

if (path == null)

path="/";

return root;

}

private String getSubDir(String path){

String subpath = null;

int pos = path.lastIndexOf("/");

if(pos == path.length()){

path = path.substring(0,path.length()-1);

pos = path.lastIndexOf("/");

}

subpath = path.substring(0,pos);

if(pos == 0)

subpath = path;

return subpath;

}

}

package hkp.dirchooser;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button btn = (Button) findViewById(R.id.btn_open);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

String path = null;

String [] fileType = {"dst"};//要过滤的文件类型列表

DirChooserDialog dlg = new DirChooserDialog(MainActivity.this,2,fileType,path);

dlg.setTitle("Choose dst file dir");

dlg.show();

}

});

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值