android 文件浏览器实现

来源:互联网 发布:淘宝店铺起名软件 编辑:程序博客网 时间:2024/05/13 22:13

项目列表


MainActivity实现代码

package com.example.sdfileexplorer;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {
ListView list;
TextView path;
Button parent;
Map<String,String[]>arrlist=new HashMap();
//记录当前父文件夹
File currentParent;
//记录当前文件夹下的所有文件数组
File[]currentFiles;
boolean isExit=false;
ArrayList<String> filepath=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=(ListView)findViewById(R.id.list);
path=(TextView)findViewById(R.id.path);
parent = (Button) findViewById(R.id.parent);

arrlist.put("fileEndingAudio",getResources().getStringArray(R.array.fileEndingAudio));
arrlist.put("fileEndingExcel",getResources().getStringArray(R.array.fileEndingExcel));
arrlist.put("fileEndingImage",getResources().getStringArray(R.array.fileEndingImage));
arrlist.put("fileEndingPackage",getResources().getStringArray(R.array.fileEndingPackage));
arrlist.put("fileEndingPdf",getResources().getStringArray(R.array.fileEndingPdf));
arrlist.put("fileEndingPPT",getResources().getStringArray(R.array.fileEndingPPT));
arrlist.put("fileEndingText",getResources().getStringArray(R.array.fileEndingText));
arrlist.put("fileEndingVideo",getResources().getStringArray(R.array.fileEndingVideo));
arrlist.put("fileEndingWebText",getResources().getStringArray(R.array.fileEndingWebText));
arrlist.put("fileEndingWord",getResources().getStringArray(R.array.fileEndingWord));

list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//如果是文件则不作处理
if(currentFiles[position].isFile()){
String extendName=getExtendFile(currentFiles[position]);///获取文件拓展名
Intent intent=openFileIntent("."+extendName, currentFiles[position]);
if(intent!=null){
startActivity(intent);
}else{
Toast.makeText(MainActivity.this, "不存在打开此文件的应用!", Toast.LENGTH_LONG);
}
}else if(currentFiles[position].isDirectory()){
File[]tmp=currentFiles[position].listFiles();
if(tmp==null||tmp.length==0){
Toast.makeText(MainActivity.this, "当前文件夹为空文件夹", Toast.LENGTH_LONG).show();
//return;
}
currentParent=currentFiles[position];
currentFiles=tmp;
inflateListView(currentFiles);
}
}
});

path.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if(!(getRoot().equals("/storage/sdcard"))){//判断是否到根目录
//获取上一级目录
currentParent=currentParent.getCanonicalFile().getParentFile();
currentFiles=currentParent.listFiles();
inflateListView(currentFiles);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
parent.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
});
}

public String getRoot(){//获取根目录的子字符串
String str="";
try {
if(currentParent.getCanonicalPath().equals("/storage/sdcard")){
str="/storage/sdcard";
}else{
str=currentParent.getCanonicalPath().substring(0, currentParent.getCanonicalPath().length()-1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK){
try{
if(getRoot().equals("/storage/sdcard")){
if(!isExit){
new Thread(){
public void run(){
int count=0;
while(count<5000){
count++;
}
isExit=false;
}
}.start();
Toast.makeText(MainActivity.this, "在按一次退出SD卡文件浏览器", Toast.LENGTH_SHORT).show();
isExit=true;
}else if(isExit){
finish();
}
}else{
currentParent=currentParent.getCanonicalFile().getParentFile();
currentFiles=currentParent.listFiles();
inflateListView(currentFiles);
}
}catch(Exception e){
e.printStackTrace();
}
}else if(keyCode==KeyEvent.KEYCODE_MENU){
if(getRoot().equals("/storage/sdcard")){
openOptionsMenu();
}

}
return true;
}

///根据拓展名获取相应的Intent
public Intent openFileIntent(String extendFileName,File file){
String intentType=null;
for(String set:arrlist.keySet()){
String[]tmp=arrlist.get(set);
for(int j=0;j<tmp.length;j++){
if(extendFileName.equals(tmp[j])){
if(set.equals("fileEndingAudio")){
return OpenFile.getAudioFileIntent(file);
}else if(set.equals("fileEndingExcel")){
return OpenFile.getExcelFileIntent(file);
}else if(set.equals("fileEndingImage")){
return OpenFile.getImageFileIntent(file);
}else if(set.equals("fileEndingPackage")){
return OpenFile.getApkFileIntent(file);
}else if(set.equals("fileEndingPdf")){
return OpenFile.getPdfFileIntent(file);
}else if(set.equals("fileEndingPPT")){
return OpenFile.getPPTFileIntent(file);
}else if(set.equals("fileEndingText")){
return OpenFile.getTextFileIntent(file);
}else if(set.equals("fileEndingVideo")){
return OpenFile.getVideoFileIntent(file);
}else if(set.equals("fileEndingWebText")){
return OpenFile.getHtmlFileIntent(file);
}else if(set.equals("fileEndingWord")){
return OpenFile.getWordFileIntent(file);
}
break;
}
}
}
return null;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
Log.e("oncreateop", "fdadfad");
//menu=(Menu) LayoutInflater.from(MainActivity.this).inflate(R.menu.menu,null);
MenuInflater inflater=new MenuInflater(this);
inflater.inflate(R.menu.menu, menu);
//获取系统的SD卡的目录
File root=null;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){///获取的是内置存储卡
BufferedReader br=null;
try {
br=new BufferedReader(new FileReader(new File("/system/etc/vold.fstab")));
StringBuilder sb=new StringBuilder("");
String line=null;
while((line=br.readLine())!=null){
String[]strtmp=line.split(" ");
if(strtmp.length>0){
if(strtmp[0].equals("dev_mount")){
if(strtmp[3].equals("emmc@fat")){
Log.e("emmc@fat", "内置存储卡");
menu.addSubMenu("内置存储卡");
filepath.add(strtmp[2]);
}else if(strtmp[3].equals("auto")){
Log.e("auto", "外置存储卡");
menu.addSubMenu("外置存储卡");
filepath.add(strtmp[2]);
}
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException io){
io.printStackTrace();
}
root=new File(Environment.getExternalStorageDirectory().getPath());
if(root.exists()){
currentParent=root;
currentFiles=currentParent.listFiles();
//使用当前目录下的全部文件、文件夹来填充ListView
inflateListView(currentFiles);
}
}else{
Toast.makeText(MainActivity.this, "手机中没有SD卡", Toast.LENGTH_LONG).show();
}
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getTitle().toString().trim().equals("内置存储卡")){
currentParent=new File(filepath.get(0));
currentFiles=currentParent.listFiles();
inflateListView(currentFiles);
}else if(item.getTitle().toString().trim().equals("外置存储卡")){
currentParent=new File(filepath.get(1));
currentFiles=currentParent.listFiles();
inflateListView(currentFiles);
}

return true;
}

private void inflateListView(File[]files){
List<Map<String,Object>>listItems=new ArrayList<Map<String,Object>>();
if(files!=null){
for(int i=0;i<files.length;i++){
Map<String,Object>listItem=new HashMap<String, Object>();
if(files[i].isDirectory()){
listItem.put("icon", R.drawable.folder);
}else if(files[i].isFile()){
listItem.put("icon", R.drawable.file);
}
listItem.put("filename", files[i].getName());
listItems.add(listItem);
}
//SimpleAdapter adapter=new SimpleAdapter(MainActivity.this, listItems,R.layout.line, new String[]{"icon","filename"}, new int[]{R.id.icon,R.id.file_name});
}
MyAdapter adapter=new MyAdapter(MainActivity.this, listItems);
list.setAdapter(adapter);
try {
path.setText("当前路径为:"+currentParent.getCanonicalPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public String getExtendFile(File file){
String path=file.getPath();
String[]strtmp=path.split("\\.");
if(strtmp.length>0){
return strtmp[strtmp.length-1];
}else{
return null;
}

}
}




class MyAdapter extends BaseAdapter{
Context context;
List<Map<String,Object>>listItems;
public MyAdapter(Context context,List<Map<String,Object>>listItems){
this.context=context;
this.listItems=listItems;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listItems.size();
}


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


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


@Override
public View getView(int position, View convertView, ViewGroup parent) {

convertView=LayoutInflater.from(context).inflate(R.layout.line,null);
ImageView image=(ImageView) convertView.findViewById(R.id.icon);
TextView textView=(TextView)convertView.findViewById(R.id.file_name);
if(listItems!=null&&listItems.size()>0){
image.setImageResource(Integer.parseInt(listItems.get(position).get("icon").toString()));
textView.setText(listItems.get(position).get("filename").toString());
textView.setTextColor(Color.WHITE);
}

return convertView;
}

}


OpenFile实现代码

package com.example.sdfileexplorer;


import java.io.File;


import android.content.Intent;
import android.net.Uri;


public class OpenFile {
//android获取一个用于打开HTML文件的intent
public static Intent getHtmlFileIntent(File file)
{
   Uri uri = Uri.parse(file.toString()).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(file.toString()).build();
   Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(uri, "text/html");
   return intent;
}
    //android获取一个用于打开图片文件的intent
    public static Intent getImageFileIntent(File file)
    {
        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(file);
   intent.setDataAndType(uri, "image/*");
        return intent;
    }
    //android获取一个用于打开PDF文件的intent
public static Intent getPdfFileIntent(File file)
{
     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(file);
     intent.setDataAndType(uri, "application/pdf");
     return intent;
}
    //android获取一个用于打开文本文件的intent
    public static Intent getTextFileIntent(File file)
    {   
   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(file);
   intent.setDataAndType(uri, "text/plain");
   return intent;
    }
    
  //android获取一个用于打开音频文件的intent
    public static Intent getAudioFileIntent(File file)
    {
     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(file);
     intent.setDataAndType(uri, "audio/*");
     return intent;
    }
    //android获取一个用于打开视频文件的intent
    public static Intent getVideoFileIntent(File file)
    {
     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(file);
     intent.setDataAndType(uri, "video/*");
     return intent;
    }




    //android获取一个用于打开CHM文件的intent
    public static Intent getChmFileIntent(File file)
    {
     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(file);
     intent.setDataAndType(uri, "application/x-chm");
     return intent;
    }




  //android获取一个用于打开Word文件的intent
    public static Intent getWordFileIntent(File file)
    {
     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(file);
     intent.setDataAndType(uri, "application/msword");
     return intent;
    }
  //android获取一个用于打开Excel文件的intent
    public static Intent getExcelFileIntent(File file)
    {
     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(file);
     intent.setDataAndType(uri, "application/vnd.ms-excel");
     return intent;
    }
  //android获取一个用于打开PPT文件的intent
    public static Intent getPPTFileIntent(File file)
    {
     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(file);
     intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
     return intent;
    }
    //android获取一个用于打开apk文件的intent
    public static Intent getApkFileIntent(File file)
    {
       Intent intent = new Intent(); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.setAction(android.content.Intent.ACTION_VIEW); 
       intent.setDataAndType(Uri.fromFile(file),  "application/vnd.android.package-archive"); 
       return intent;
    }
}


运行效果图


本人测试手机为android 4.2.2,有问题留言

源代码可在csdn下载

0 0
原创粉丝点击