安卓7.0编程创建文件夹后不显示,扫描文件系统遇权限问题求助
解决Android 7.0创建文件夹后USB不显示及扫描报错的问题
首先,咱们拆解你遇到的两个核心问题:发送ACTION_MEDIA_MOUNTED广播触发SecurityException,以及文件夹在USB连接时不显示,下面逐个击破:
1. 为什么发送ACTION_MEDIA_MOUNTED会报错?
从Android 7.0(API 24)开始,系统严格限制了第三方应用发送ACTION_MEDIA_MOUNTED广播——它属于系统级广播,只有系统进程才能发送,第三方应用调用会直接抛出SecurityException,所以这段代码必须删掉。
2. 正确的文件扫描姿势
你应该针对你创建的具体文件夹路径进行扫描,而非整个外部存储,这样既高效又不会触发权限问题。修改后的MediaScanner代码如下:
// 假设你创建的文件夹路径是folderPath,示例: String folderPath = Environment.getExternalStorageDirectory() + "/MyCustomFolder"; // 也可以用公共目录,比如Download: // String folderPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/MyCustomFolder"; MediaScannerConnection.scanFile( context, new String[]{folderPath}, // 仅扫描目标文件夹 null, // 无需指定MIME类型,系统会自动识别 new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { Log.d("MediaScanner", "扫描完成:" + path); } } );
3. 权限检查与动态申请
Android 6.0(API 23)及以上,即便在Manifest里声明了WRITE_EXTERNAL_STORAGE权限,也需要在运行时动态申请,否则会导致文件夹创建或扫描失败:
第一步:在AndroidManifest.xml中声明权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
第二步:运行时动态申请权限
在创建文件夹或扫描文件前,先检查并申请权限:
private static final int REQUEST_WRITE_PERMISSION = 1001; // 检查权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( (Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION ); } else { // 权限已授予,执行创建文件夹和扫描逻辑 createFolderAndScan(context); } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_WRITE_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { createFolderAndScan(context); } else { Toast.makeText(context, "需要存储权限才能创建文件夹", Toast.LENGTH_SHORT).show(); } } } // 创建文件夹并扫描的方法 private void createFolderAndScan(Context context) { File customFolder = new File(Environment.getExternalStorageDirectory(), "MyCustomFolder"); if (!customFolder.exists()) { boolean isCreated = customFolder.mkdirs(); if (isCreated) { // 创建成功后扫描该文件夹 MediaScannerConnection.scanFile( context, new String[]{customFolder.getAbsolutePath()}, null, (path, uri) -> Log.d("MediaScanner", "文件夹已扫描:" + path) ); } else { Toast.makeText(context, "文件夹创建失败", Toast.LENGTH_SHORT).show(); } } }
4. USB连接时看不到文件夹的额外排查
如果你是在Android/data/你的应用包名目录下创建的文件夹,这个目录属于应用私有外部存储,在USB MTP模式下默认隐藏,用户需要在电脑文件管理器中开启“显示隐藏文件”才能看到。如果要让文件夹直接可见,建议将其创建在公共目录(如Download、Pictures)或外部存储根目录下。
按照上述步骤修改后,应该就能解决你的问题了。
内容的提问来源于stack exchange,提问作者Shail




