Android sd卡状态监听,文件搜索,媒体文件刷新

整理一下关于sd卡相关知识点,主要包括sd卡状态监听,sd卡文件搜索,sd卡媒体数据库(系统支持媒体类型)刷新模块:

一:sd卡状态进行监听

有时程序进行外部数据读取和写入时,为防止异常发生需要对sd卡状态进行监听,对于sd卡的状态我们可以采用注册广播来实现

下面是文档中一个经典例子;

[java] view plaincopy在CODE上查看代码片派生到我的代码片

//监听sdcard状态广播  
   BroadcastReceiver mExternalStorageReceiver;  
   //sdcard可用状态  
   boolean mExternalStorageAvailable = false;  
   //sdcard可写状态  
   boolean mExternalStorageWriteable = false;  

   void updateExternalStorageState() {  
       //获取sdcard卡状态  
       String state = Environment.getExternalStorageState();  
       if (Environment.MEDIA_MOUNTED.equals(state)) {  
           mExternalStorageAvailable = mExternalStorageWriteable = true;  
       } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {  
           mExternalStorageAvailable = true;  
           mExternalStorageWriteable = false;  
       } else {  
           mExternalStorageAvailable = mExternalStorageWriteable = false;  
       }  

   }  
   //开始监听  
   void startWatchingExternalStorage() {  
       mExternalStorageReceiver = new BroadcastReceiver() {  
           @Override  
           public void onReceive(Context context, Intent intent) {  
               Log.i("test", "Storage: " + intent.getData());  
               updateExternalStorageState();  
           }  
       };  
       IntentFilter filter = new IntentFilter();  
       filter.addAction(Intent.ACTION_MEDIA_MOUNTED);  
       filter.addAction(Intent.ACTION_MEDIA_REMOVED);  
       registerReceiver(mExternalStorageReceiver, filter);  
       updateExternalStorageState();  
   }  
   //停止监听  
   void stopWatchingExternalStorage() {  
       unregisterReceiver(mExternalStorageReceiver);  
   }  

二:sdcard下搜索某一类型(通常是后缀名相同)文件,或是指定文件名的查找功能

(1)搜索指定文件

[java] view plaincopy在CODE上查看代码片派生到我的代码片

public String searchFile(String filename){    

        String res="";    
        File[] files=new File("/sdcard").listFiles();    
        for(File f:files){    
            if(f.isDirectory())    
                searchFile(f.getName());    
            else    
            if(f.getName().indexOf(filename)>=0)    
                res+=f.getPath()+"\n";    
        }    
        if(res.equals(""))    
            res="file can't find!";    
        return res;    
    }    

(2)指定相同后缀名称文件类型

[java] view plaincopy在CODE上查看代码片派生到我的代码片

private List<String> files = new ArrayList<String>();    

class FindFilter implements FilenameFilter {    
    public boolean accept(File dir, String name) {    
        return (name.endsWith(".txt"));    
    }    
}    

public void updateList() {    
     File home = new File("/sdcard/");    
  if (home.listFiles( new FindFilter()).length > 0) {    
      for (File file : home.listFiles( new FindFilter())) {    
       files.add(file.getName());    

三:媒体数据库的刷新,

当android的系统启动的时候,系统会自动扫描sdcard内的文件,并把获得的媒体文件信息保存在一个系统媒体数据库中,
程序想要访问多媒体文件,就可以直接访问媒体数据库中即可,而用直接去sdcard中取。
但是,如果系统在不重新启动情况下,媒体数据库信息是不会更新的,这里举个例子,当应用程序保存一张图片到本地后(已成功),
但打开系统图片库查看时候,你会发现图片库内并没有你刚刚保存的那张图片,原因就在于系统媒体库没有及时更新,这时就需要手动刷新文件系统了

方式一:发送一广播信息通知系统进行文件刷新

[java] view plaincopy在CODE上查看代码片派生到我的代码片

private void scanSdCard(){    
           IntentFilter intentfilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);    
           intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);    
           intentfilter.addDataScheme("file");            
           registerReceiver(scanSdReceiver, intentfilter);    
           Intent intent = new Intent();    
           intent.setAction(Intent.ACTION_MEDIA_MOUNTED);    
           intent.setData(Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath()));    
           sendBroadcast(intent);    

       }    

       private BroadcastReceiver scanSdReceiver = new BroadcastReceiver(){    

           private AlertDialog.Builder builder;    
           private AlertDialog ad;    
           @Override    
           public void onReceive(Context context, Intent intent) {    
               String action = intent.getAction();    

               if(Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)){    
                   builder = new AlertDialog.Builder(context);    
                   builder.setMessage("正在扫描sdcard...");    
                   ad = builder.create();    
                   ad.show();    
               //    adapter.notifyDataSetChanged();    
               }else if(Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)){    
                   ad.cancel();//重新获取文件数据信息    
                   Toast.makeText(context, "扫描完毕", Toast.LENGTH_SHORT).show();    
           }       
       }    
   };    

或者

[java] view plaincopy在CODE上查看代码片派生到我的代码片

public void fileScan(File file){      
        Uri data =  Uri.parse("file://"+ Environment.getExternalStorageDirectory())      
  sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));      
    }     

[java] view plaincopy在CODE上查看代码片派生到我的代码片

void insertMeadia(ContentValues values){    
         Uri uri = getContentResolver().insert( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);     
         sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));    
    }    

刷新所有系统文件,效率可能不高,高效方法是只刷新变化的文件

方式二:指定特定文件操作

[java] view plaincopy在CODE上查看代码片派生到我的代码片

File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES);    
       File file = new File(path, "DemoPicture.jpg");    

       try {    

           InputStream is = getResources().openRawResource(R.drawable.balloons);    
           OutputStream os = new FileOutputStream(file);    
           byte[] data = new byte[is.available()];    
           is.read(data);    
           os.write(data);    
           is.close();    
           os.close();    

           // Tell the media scanner about the new file so that it is    
           // immediately available to the user.    
           MediaScannerConnection.scanFile(this,    
                   new String[] { file.toString() }, null,    
                   new MediaScannerConnection.OnScanCompletedListener() {    
               public void onScanCompleted(String path, Uri uri) {    
                   Log.i("ExternalStorage", "Scanned " + path + ":");    
                   Log.i("ExternalStorage", "-> uri=" + uri);    
               }    
           });    
       } catch (IOException e) {    
           // Unable to create file, likely because external storage is    
           // not currently mounted.    
           Log.w("ExternalStorage", "Error writing " + file, e);    
       } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值