Android 5.0以上扫描文件问题

本文介绍在Android5.0及以上版本中如何正确进行文件扫描。由于安全限制,使用ACTION_MEDIA_MOUNTED会触发权限异常,应改为使用ACTION_MEDIA_SCANNER_SCAN_FILE。文章还提供了MediaScannerReceiver类的实现示例,展示如何监听并处理文件变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android 5.0以上不支持文件的全局扫描,即没有发全局扫描广播的权限【系统可以发全局扫描的广播】

回忆一下5.0之前的广播写法

通过主动的方式通知系统我们需要文件列表,要向系统发送广播

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(“file://”
+ Environment.getExternalStorageDirectory()))); 

但是在5.0以上就会报错【java.lang.SecurityException:permission denial:not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid = 30864,uid = 10119

正确的做法:

<pre name="code" class="java">sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(“file://”
+ Environment.getExternalStorageDirectory()))); 



然后通过接收器获取系统文列表

    public class MediaScannerReceiver extends BroadcastReceiver
    {
        private final static String TAG = ”MediaScannerReceiver”;
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Uri uri = intent.getData();
            String externalStoragePath = Environment.getExternalStorageDirectory().getPath();
            if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
                // scan internal storage
                scan(context, MediaProvider.INTERNAL_VOLUME);
            } else {
                if (uri.getScheme().equals(“file”)) {
                    // handle intents related to external storage
                    String path = uri.getPath();
                    if (action.equals(Intent.ACTION_MEDIA_MOUNTED) &&
                            externalStoragePath.equals(path)) {
                        scan(context, MediaProvider.EXTERNAL_VOLUME);
                    } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) &&
                            path != null && path.startsWith(externalStoragePath + ”/”)) {
                        scanFile(context, path);
                    }
                }
            }
        }
        private void scan(Context context, String volume) {
            Bundle args = new Bundle();
            args.putString(“volume”, volume);
            context.startService(
                    new Intent(context, MediaScannerService.class).putExtras(args));
        }
        private void scanFile(Context context, String path) {
            Bundle args = new Bundle();
            args.putString(“filepath”, path);
            context.startService(
                    new Intent(context, MediaScannerService.class).putExtras(args));
        }
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值