Android 文件管理 新建文件夹

需求

越来越多的设备使用MTP的方式连接PC,传输数据。项目中需要在连接PC的状态下,做新建文件的操作,需要及时更新PC端的显示。

方案及代码

【环境】4.4以上;win7
【失败方案】最开始以为是没有及时更新媒体库的原因,使用发送广播重新扫描:

  mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory().getPath())));
  mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file:///mnt/external_sd")));

PS:有可能是因为空文件夹默认不刷新。(未验证)

【成功方案】相信很多人都找到了MediaScannerConnection.scanFile()方法。这个方法确实可行,但用法有些特殊。
MediaScannerConnection.scanFile()不刷新新的空文件夹!(坑了我半天)。从官方的方法注释也看不出支持还是不支持文件夹的扫描,所以我一度认为它只支持文件扫描。不扯了,上代码

 private void updateMTP(String path, String name) {
    String filePath = path + File.separator + name + File.separator + ".tempFile.txt";
    File tempFile = new File(filePath);
    boolean createTempFileState = false;
    try {
        createTempFileState = tempFile.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    //如果创建失败,直接放弃扫描
    if (createTempFileState) {
        //在设备连接电脑时,4.4以上不能用Intent.ACTION_MEDIA_MOUNTED扫描SD卡的广播
        //可使用MediaScannerConnection.scanFile()方法,但是这个方法在创建空文件夹时要特殊处理
        // 1.创建文件夹
        // 2.在文件夹下创建一个临时文件
        // 3.扫描并等到扫描结束删除临时文件
        MediaScannerConnection.scanFile(
                mContext,
                new String[]{filePath},
                null,
                new MediaScannerConnection.MediaScannerConnectionClient() {
                    @Override
                    public void onMediaScannerConnected() {}

                    @Override
                    public void onScanCompleted(String path, Uri uri) {
                        File fileForDelete = new File(path);
                        if (fileForDelete.exists() && fileForDelete.delete()) {
                            //文件存在且删除成功的情况下,删除对应的媒体库数据
                            mContext.getContentResolver().delete(uri, null, null);
                        }
                    }
                }
        );
    }
}

参考

解决 android 在sd卡新建文件后需要重启才能找到的评论
Android通过广播更新文件和文件夹到媒体库
Android4.4中拒绝发送Intent.ACTION_MEDIA_MOUNTED扫描SD卡的广播 - Geder

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,482评论 25 708
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,589评论 9 467
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,987评论 19 139
  • Android初级: 1.了解Android系统架构 应用层: Java应用开发工程师开发的所有应用程序比如地图,...
    醉馬当前闯阅读 4,731评论 2 32
  • 流年似水, 婉然而逝。 任喧嚣, 淹没在漫漫时光里。 倚窗, 握一卷古词。 启唇, 便口齿生香。 清浅时光里, 有...
    染青绫阅读 267评论 8 9