博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手动通知扫描SD卡主动生成缩略图
阅读量:4947 次
发布时间:2019-06-11

本文共 2753 字,大约阅读时间需要 9 分钟。

最近做项目遇到的难题,调用系统拍照获取不到缩略图,非得关机重启才会生成,所以我们要主动通知系统扫描SD卡生成缩略图,

在Android4.4之前也就是以发送一个Action为“Intent.ACTION_MEDIA_MOUNTED”的广播通知执行扫描。如下:

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

但在Android4.4中,则会抛出以下异常:

W/ActivityManager(  498): Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=2269, uid=20016 

那是因为Android4.4中限制了系统应用才有权限使用广播通知系统扫描SD卡。 
解决方式: 
使用MediaScannerConnection执行具体文件或文件夹进行扫描。

1 Intent mediaScanIntent = new Intent(2                     Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);3             String path = "file://"4                             + out.getPath();5             Uri contentUri = Uri.parse(path); //out is your output file6             mediaScanIntent.setData(contentUri);7             this.sendBroadcast(mediaScanIntent);
MediaScannerReceiver 源码中的广播接收的部分代码:
1  @Override   2     public void onReceive(Context context, Intent intent) {   3         String action = intent.getAction();   4         Uri uri = intent.getData();   5         String externalStoragePath = Environment.getExternalStorageDirectory().getPath();   6    7         if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {   8             // scan internal storage   9             scan(context, MediaProvider.INTERNAL_VOLUME);  10         } else {  11             if (uri.getScheme().equals("file")) {  12                 // handle intents related to external storage  13                 String path = uri.getPath();  14                 if (action.equals(Intent.ACTION_MEDIA_MOUNTED) &&   15                         externalStoragePath.equals(path)) {  16                     scan(context, MediaProvider.EXTERNAL_VOLUME);  17                 } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) &&  18                         path != null && path.startsWith(externalStoragePath + "/")) {  19                     scanFile(context, path);  20                 }  21             }  22         }  23     }

 

所以最后的代码是:

1 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 2             Intent mediaScanIntent = new Intent( 3                     Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 4             String path = "file://" 5                             + out.getPath(); 6             Uri contentUri = Uri.parse(path); //out is your output file 7             mediaScanIntent.setData(contentUri); 8             this.sendBroadcast(mediaScanIntent);10         } else {11             sendBroadcast(new Intent(12                     Intent.ACTION_MEDIA_MOUNTED,13                     Uri.parse("file://"14                             + Environment.getExternalStorageDirectory())));15         }

 

 

转载于:https://www.cnblogs.com/kelina2mark/p/4884357.html

你可能感兴趣的文章
flume介绍
查看>>
eclipse优化总结
查看>>
java异常处理
查看>>
【操作系统】主存空间的分配和回收
查看>>
JZOJ 4.1 B组 俄罗斯方块
查看>>
HDU6409 没有兄弟的舞会
查看>>
2018 Multi-University Training Contest 10 - TeaTree
查看>>
HDU6205 card card card
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6198 number number number
查看>>
HDU6438 Buy and Resell
查看>>
HDU6446 Tree and Permutation
查看>>
HDU6201 transaction transaction transaction
查看>>
HDU6203 ping ping ping
查看>>
前端小笔记
查看>>
《人人都是产品经理》书籍目录
查看>>
Netsharp系列文章目录结构
查看>>
如何在git bash中运行mysql
查看>>
OO第三阶段总结
查看>>
构建之法阅读笔记02
查看>>