You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

安卓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模式下默认隐藏,用户需要在电脑文件管理器中开启“显示隐藏文件”才能看到。如果要让文件夹直接可见,建议将其创建在公共目录(如DownloadPictures)或外部存储根目录下。

按照上述步骤修改后,应该就能解决你的问题了。

内容的提问来源于stack exchange,提问作者Shail

火山引擎 最新活动