android 本地文件管理器开发

第一步:主界面布局文件,只需要定义一个button和listview即可,

 
 
    <Button
        android:id="@+id/bt_select"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="本地文件"
        android:background="@drawable/btn"/>
    <LinearLayout
        android:id="@+id/ll_return"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginTop="5dp"
        android:orientation="vertical">
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/weakRed"
            android:layout_marginTop="3dp"></View>
        <ImageView
            android:id="@+id/iv_return"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginLeft="10dp"
            android:src="@drawable/fanhui"
            android:layout_gravity="center_vertical"/>
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/weakRed"
            android:layout_marginTop="3dp"></View>
    </LinearLayout>
<ListView
    android:id="@+id/lv_show"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   ></ListView>
自定义listview的布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >
    <ImageView
        android:id="@+id/iv_show"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_gravity="center"
        android:layout_marginLeft="5dp"/>
    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        android:textSize="17sp"/>

</LinearLayout>

第二步:Android6.0以上需要动态申请权限,

(1)AndroidManifest.xml配置文件中,添加以下权限,

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
(2)在项目的build.gradle中添加依赖:

implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'

(3)代码中创建对象

 
 
private RxPermissions mRxPermissions;
 
 
mRxPermissions=new RxPermissions(this);
 
 
mRxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION , Manifest.permission.CAMERA)
        .subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                if(!aBoolean){//授予权限
                  
                }else {禁止权限
                   
                }
            }
        });
 
 

第三步:自定义工具类MainUtils,代码得到本地根目录下所有文件及文件夹的集合

/**
 * 递归遍历出目录下面所有文件
 * @param pathName 需要遍历的目录,必须以"/"开始和结束
 * @throws IOException
 */
public List<String>filelist;
private List<Const>constList;
private List<String>memoryList=new ArrayList<>();//记录上一次的所有文件路径,当下一级目录有数据时,再赋值给它,如果没有,保留上一次数据,防止为空时,路径异常
public List<String> List(String pathName) throws IOException{
    filelist=new ArrayList<>();
    constList=new ArrayList<>();
    if(pathName.startsWith("/")&&pathName.endsWith("/")){
        final String directory = pathName;
        //更换目录到当前目录
   
            File[] files = new File(directory).listFiles();
            for(File file:files){
                if(file.isFile()){
                    filelist.add(directory+file.getName());
                    Const con=new Const();
                    con.setImg(R.drawable.wenjian);
                    con.setText(file.getName());
                    constList.add(con);
                }else if(file.isDirectory()){
                    filelist.add(directory+file.getName()+"/");
                    Const con=new Const();
                    con.setImg(R.drawable.wenjianja);
                    con.setText(file.getName());
                    constList.add(con);
                }
            }
   
        }

    if(filelist.size()>0){
        memoryList.clear();
        memoryList.addAll(filelist);
    }
    return memoryList;
}
 
 

将得到的数据集合展示到界面

public void select(String Npath){
    try {
        path=Npath;
        stringList=List(path,OnItem.getOneItem().getTemp());
        arrayAdapter=new Showadapter(context,constList);
        lv_show.setAdapter(arrayAdapter);
    } catch (IOException e) {
        Log.e("异常:",e.getMessage().toString());
    }
}
listview的点击事件
public void lvItemClick(){
    lv_show.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            try {
                if(OnItem.getOneItem().getTemp()==2){
                    if(stringList.size()>0){
                        if(!new File(stringList.get(i)).isFile()){
                            path=stringList.get(i);
                            stringList=List(stringList.get(i),2);
                            if(stringList.size()>0){
                                arrayAdapter=new Showadapter(context,constList);
                                lv_show.setAdapter(arrayAdapter);
                                arrayAdapter.notifyDataSetChanged();
                            }
                        }else {
                            openFile.openFile(stringList.get(i));
                        }
                    }
                }
            } catch (IOException e) {
                Log.e("异常:",e.getMessage().toString());
            }
        }
    });
}

第四步:MainActivity中调用工具类中的方法

case R.id.bt_select://本地文件
    attemptPermissions();
    mainUtils.lvItemClick();
    ll_return.setVisibility(View.VISIBLE);
    mainUtils.select(Environment.getExternalStorageDirectory()+"/");
    break;

最后,效果图,完整的源码中包含FTP服务器上文件管理和本地文件上传至服务器的功能,可以自己调用点击打开链接


完整代码下载链接

https://download.csdn.net/download/u011897782/10418123

猜你喜欢

转载自blog.csdn.net/u011897782/article/details/80336289