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         }
     
  • 相关阅读:
    Redis——发布/订阅
    Redis——任务队列
    GOF设计模式——Builder模式
    GOF设计模式——Prototype模式
    GOF设计模式——Singleton模式
    shell 脚本中的数学计算表达
    shell $'somestring'
    shell if-elif-elif-fi
    vim 使用
    疑问:为什么要使用href=”javascript:void(0);”?
  • 原文地址:https://www.cnblogs.com/kelina2mark/p/4884357.html
Copyright © 2011-2022 走看看