在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));
}
}