智汀云盘-开发指南android端:文件列表及权限说明

1. 文件类型说明

  • 文件夹分为私人文件和共享文件夹,私人文件夹只有在文件夹管理创建文件夹时,选择可访问者的那个人可以访问;
  • 共享文件夹只有在文件夹管理创建文件夹时,选择可访问者的那些人可以访问。
  • 私人文件夹又可分为加密文件夹,未加密文件夹:
  1. 如果是加密文件夹的话,访问时需要输入正确密码才能访问;
  2. 未加密文件夹可以直接访问。
  • 共享文件夹又分为在创建文件夹时的共享文件夹和别人共享给我的文件夹

1.如果是在主界面的情况下,创建文件夹时的共享文件夹是不能做任何操作,只能查看文件夹详情
2.别人共享给我的文件夹,是可以进行共享、下载、复制、重新命名操作

注:上述操作,必须要有相应的操作权限,包括查看文件夹详情。下面是对文件夹类型的进一步说明。

在说明之前,我们可以先看看文件的实体类(有说明字段定义的字段之外,其它字段都是接口返回):

/**
 * 文件实体类
 */
public class FileBean implements Serializable {


    /**
     * name : config.yaml
     * size : 1474
     * mod_time : 1622010079
     * type : 1
     * path : /1/demo-plugin/config.yaml
     * from_user :
     */

    private String name;  // 名称
    private long size;  // 大小(b)
    private long mod_time; // 修改时间
    private int type;//0是文件夹 1文件
    private String path; // 路径
    private String from_user;  // 共享者名称
    private boolean selected; // 是否选中该条数据,自己定义的字段

    private int is_encrypt; // 是否加密文件夹;文件夹有效:1加密,0不需要加密
    private int read; // 是否可读:1/0
    private int write; //是否可写:1/0
    private int deleted; // 是否可删:1/0

    private boolean enabled = true;  // 是否可操作,自己定义的字段
    
    ...
}
  • 如果是私人文件,我们访问的接口是:GET: /plugin/wangpan/resources/:path(path参数为空),在我们获取到私人文件夹之后,我们可以根据is_encrypt(1 加密,0 未加密)这个字段去判断改文件夹是否加密
  • 如果是共享文件夹,我们访问的接口是GET: /plugin/wangpan/shares,在我们获取到共享文件夹之后,我们可以根据from_user这个字段判断是在文件夹创建的共享文件夹还是别人共享给我的文件夹,如果from_user未空的话,则是在文件夹管理创建的文件夹,否则的话是别人共享给我的文件夹,而from_user的值就是共享给我的用户。
  • 文件夹详情,不管是私人文件夹还是共享文件夹,我们访问的接口都是GET: /plugin/wangpan/resources/:path(path:一级目录为空)

1) 主界面的文件获取列表代码实现

public class HomePresenter extends BasePresenter implements HomeContract.Presenter {
    ...
    /**
     * 文件
     * @param scopeToken    凭证
     * @param path
     * @param map
     */
    @Override
    public void getFiles(String scopeToken, String path, Map map, boolean showLoading) {
        executeObservable(mModel.getFiles(scopeToken, path, map), new RequestDataCallback(showLoading) {
            @Override
            public void onSuccess(FileListBean response) {
                super.onSuccess(response);
                mView.getFilesSuccess(response);
            }

            @Override
            public void onFailed(int errorCode, String errorMessage) {
                super.onFailed(errorCode, errorMessage);
            }
        });
    }
    ...
}

2) 主界面的共享文件夹获取列表数据代码实现

public class SharePresenter extends BasePresenter implements ShareContract.Presenter {

    @Override
    public ShareModel createModel() {
        return new ShareModel();
    }

    /**
     * 共享文件夹列表
     * @param scopeToken    凭证
     * @param showLoading   是否显示加载弹窗
     */
    @Override
    public void getShareFolders(String scopeToken, boolean showLoading) {
        executeObservable(mModel.getShareFolders(scopeToken), new RequestDataCallback(showLoading) {
            @Override
            public void onSuccess(FileListBean response) {
                super.onSuccess(response);
                mView.getFilesSuccess(response);
            }

            @Override
            public void onFailed(int errorCode, String errorMessage) {
                super.onFailed(errorCode, errorMessage);
            }
        });
    }
}

3) 获取文件夹详情数据代码实现

public class FileDetailPresenter extends BasePresenter implements FileDetailContract.Presenter {
    ...
        /**
     * 文件列表 有密码参数
     * @param scopeToken    凭证
     * @param pwd           密码,加密文件的话传对应的密码,没有则传空串就行
     * @param path          路径
     * @param map           分页参数
     * @param showLoading   是否显示加载弹窗
     */
    @Override
    public void getFiles(String scopeToken, String pwd, String path, Map map, boolean showLoading) {
        executeObservable(mModel.getFiles(scopeToken, pwd, path, map), new RequestDataCallback(showLoading) {
            @Override
            public void onSuccess(FileListBean response) {
                super.onSuccess(response);
                if (mView!=null)
                    mView.getFilesSuccess(response);
            }

            @Override
            public void onFailed(int errorCode, String errorMessage) {
                super.onFailed(errorCode, errorMessage);
                if (mView!=null)
                    mView.getFilesFail(errorCode, errorMessage);
            }
        });
    }
    ...
}    

2. 权限说明

1) 这里的权限主要是指对文件/文件夹的读、写和删的操作权限。在详细说明之前,我们先看下面这个表格。

权限 备注
1、查看该文件夹及其下面所有文件/文件夹的权限;2、有权限才展示对应文件夹的入口;
1、包括新建文件夹、上传、重命名、共享、下载的权限;2、有权限才展示对应操作的入口;
1、包括移动、删除的权限;2、有权限才展示对应的操作的入口;3、有移动、复制的权限,不代表能成功移动复制,需要看是否有移入文件夹的【写】权限,有才能操作。

注:复制功能不受权限控制

从表中我们可以看出读权限对应文件夹/文件的查看操作:

  • 写权限对应新建文件、上传、重命名、共享和下载的操作
  • 删权限对应移动和删除的操作。 我们在移动和复制的时候不一定能够移动和复制成功,因为我们在移动到目标文件时是否成功,还得看目标文件夹是否又写权限。 这些权限的设置是从文件夹管理创建文件夹时或共享文件时设置给对应访问者设置。

注:共享只能共享文件夹,不能共享文件

2) 接下来是对共享、移动和复制操作的进一步说明,为了更加直观的阐述,我们直接用表格来表达。

  • 根据文件类型来决定是否可共享
文件夹的根目录文件类型 是否可共享
私人文件夹(未加密) 可共享
私人文件夹(已加密) 不可共享
共享文件夹 可共享
别人共享给我的文件夹 可共享
  • 根据文件/文件夹类型来决定可移动到的目标路径
文件/文件夹的根目录文件类型操作 可移动到位置
私人文件夹(未加密) 任何位置
私人文件夹(已加密) 该已加密文件/文件夹所属根目录内
共享文件夹 任何位置
别人共享给我的文件夹 该共享文件夹所属根目录内
  • 根据文件/文件夹的类型来决定可复制的目标路径
文件/文件夹的根目录文件类型 可复制到位置
私人文件夹(未加密) 任何位置
私人文件夹(已加密) 该已加密文件/文件夹所属根目录内
共享文件夹 任何位置
别人共享给我的文件夹 任何位置

3) 下面部分是部分代码实现

/**
 * 文件详情
 */
public class FileDetailActivity extends BaseMVPDBActivity implements FileDetailContract.View {
    
    ...
    /**
     * 初始化文件列表
     */
    private void initRv() {
        fileDetailAdapter = new FileDetailAdapter(0);
        ...
        fileDetailAdapter.setOnItemChildClickListener((adapter, view, position) -> {
            if (view.getId() == R.id.ivSelected) {
                FileBean fileBean = fileDetailAdapter.getItem(position);
                fileBean.setSelected(!fileBean.isSelected());
                fileDetailAdapter.notifyItemChanged(position);
                List selectedData = fileDetailAdapter.getSelectedData();
                if (CollectionUtil.isNotEmpty(selectedData)) {
                    if (isEncrypt()) { // 如果是加密文件,不能共享
                        mOperateData.get(0).setEnabled(false);
                    } else {
                        mOperateData.get(0).setEnabled(fileDetailAdapter.isOnlyFolder() && FileUtil.hasWritePermission(selectedData));  // 是文件夹且有写权限才能共享
                    }
                    mOperateData.get(1).setEnabled(FileUtil.hasWritePermission(selectedData));  // 有写权限才能下载
                    mOperateData.get(2).setEnabled(FileUtil.hasDelPermission(selectedData));    // 有写权限才能移动
                    mOperateData.get(3).setEnabled(true);    // 复制不受权限影响
                    mOperateData.get(4).setEnabled(selectedData.size() == 1 && FileUtil.hasWritePermission(selectedData));  // 有写权限才能重命名
                    mOperateData.get(5).setEnabled(FileUtil.hasDelPermission(selectedData));  // 有删权限才能删除
                    fileOperateAdapter.notifyDataSetChanged();
                } else {
                    setAllEnabled();
                }
                setOperateVisible(selectedData.size() > 0);  // 设置底部文件操作是否可见
                binding.rrv.setRefreshAndLoadMore(selectedData.size() <= 0); // 设置列表是否可刷新和加载更多
            }
        });
    }
    
    ...
     /**
     * 文件的操作
     */
    private void initRvOperateFile() {
        binding.rvOperate.setLayoutManager(new GridLayoutManager(this, 6));
        fileOperateAdapter = new FileOperateAdapter();
        binding.rvOperate.setAdapter(fileOperateAdapter);
        mOperateData.add(new FileOperateBean(R.drawable.icon_share, UiUtil.getString(R.string.home_share), true));
        mOperateData.add(new FileOperateBean(R.drawable.icon_download, UiUtil.getString(R.string.home_download), true));
        mOperateData.add(new FileOperateBean(R.drawable.icon_move, UiUtil.getString(R.string.home_move), true));
        mOperateData.add(new FileOperateBean(R.drawable.icon_copy, UiUtil.getString(R.string.home_copy), true));
        mOperateData.add(new FileOperateBean(R.drawable.icon_rename, UiUtil.getString(R.string.home_rename), true));
        mOperateData.add(new FileOperateBean(R.drawable.icon_remove, UiUtil.getString(R.string.home_remove), true));
        fileOperateAdapter.setNewData(mOperateData);
        fileOperateAdapter.setOnItemClickListener((adapter, view, position) -> {
            FileOperateBean fileOperateBean = fileOperateAdapter.getItem(position);
            if (fileOperateBean.isEnabled()) {
                switch (position) {
                    case 0:  // 共享
                        Bundle bundle = new Bundle();
                        bundle.putSerializable("folder", (Serializable) fileDetailAdapter.getSelectedData());
                        bundle.putBoolean("originalWrite", FileUtil.hasWritePermission(fileDetailAdapter.getSelectedData()));
                        bundle.putBoolean("originalDel", FileUtil.hasDelPermission(fileDetailAdapter.getSelectedData()));
                        switchToActivity(ShareFolderActivity.class, bundle);
                        break;

                    case 1:  // 下载
                        downloadFiles(fileDetailAdapter.getSelectedData());
                        break;

                    case 2:  // 移动
                        toMoveCopyActivity(0, fileDetailAdapter.getSelectedPath());
                        break;

                    case 3:  // 复制到
                        toMoveCopyActivity(1, fileDetailAdapter.getSelectedPath());
                        break;

                    case 4:  // 重命名
                        FileBean fileBean = fileDetailAdapter.getSingleSelectedData();
                        int drawableRes = R.drawable.icon_file_big;
                        if (fileBean.getType() == 0) {
                            drawableRes = R.drawable.icon_file_big;
                        } else {
                            /**
                             * 1. word
                             * 2. excel
                             * 3. ppt
                             * 4. 压缩包
                             * 5. 图片
                             * 6. 音频
                             * 7. 视频
                             * 8. 文本
                             *
                             */
                            int fileType = FileTypeUtil.fileType(fileBean.getName());
                            drawableRes = FileTypeUtil.getFileBigLogo(fileType);
                        }
                        showCreateFileDialog(1, drawableRes, fileBean);
                        break;

                    case 5:  // 删除
                        showRemoveFileTips(fileDetailAdapter.getSelectedPath());
                        break;
                }
            }
        });
    }
    ...
}

/**
 * 文件夹详情列表适配器
 */
public class FileOperateAdapter extends BaseQuickAdapter {
    ...
    @Override
    protected void convert(BaseViewHolder helper, FileOperateBean item) {
        LinearLayout llParent = helper.getView(R.id.llParent);
        llParent.setAlpha(item.isEnabled() ? 1 : 0.5f);
        ImageView ivLogo = helper.getView(R.id.ivLogo);
        ivLogo.setImageResource(item.getDrawable());
        TextView tvName = helper.getView(R.id.tvName);
        tvName.setText(item.getName());
    }
}


你可能感兴趣的:(android)