zoukankan      html  css  js  c++  java
  • 手动通知扫描SD卡主动生成缩略图

    最近做项目遇到的难题,调用系统拍照获取不到缩略图,非得关机重启才会生成,所以我们要主动通知系统扫描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 file
    6             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         }
     
  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/kelina2mark/p/4884357.html
Copyright © 2011-2022 走看看