android应用如何有效获取管理存储

注: 作者原创,转载请标明出处。


谷歌原生没有提供有效的获取内部存储、SD卡、OTG设备文件区分,那么,怎样有效获取?


一般情况:

1.   通过反射调用:

StorageManager.getVolumeList();

2. 通过调用得到StorageVolume 列表,但是我们不能有效的区分哪一个是sd,otg,内部存储,怎么办?


一般内部存储的文件path以"/storage/emulated"开头,通过该标志可判断内部存储

关于sd卡和otg怎么判断?

根据前面获取到的列表数据: 

DiskInfo di= mStorageManager.findVolumeByUuid(sv.getUuid()).getDisk();

di对象有isSd()、isUsb()方法,至此可以区分开来。


具体可参考如下:


package com.fileexplorer.service;

import android.app.Service;
import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;
import android.os.storage.StorageManager;
import android.os.storage.StorageEventListener;
import android.os.storage.StorageVolume;
import android.os.storage.DiskInfo;

import android.util.Log;

import com.fileexplorer.service.FileManageService;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


/**
 * Created by Xuehao.Jiang on 2017/6/27.
 */

public class FileManageService extends Service {

    private static final String TAG = FileManageService.class.getSimpleName();
    private StorageManager mStorageManager;
    private StorageVolume[]  storageVolumes = null;
    private static List
   
   
    
     storageVolumeAll = new ArrayList
    
    
     
     ();
    private List
     
     
      
       sListeners = new ArrayList
      
      
       
       ();

    private static  final int PHONE_ROOT = 0;
    private static  final int SD_ROOT = 1;
    private static  final int OTG_ROOT = 2;
    private static  final int NONE_ROOT = -1;


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"  onCreate .... ");
        mStorageManager = (StorageManager) getSystemService(STORAGE_SERVICE);
        mStorageManager.registerListener(mStorageListener);
        init();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mStorageManager.unregisterListener(mStorageListener);
        Log.d(TAG,"  onDestroy .... ");
    }

    private final StorageEventListener mStorageListener = new StorageEventListener() {

        @Override
        public void onStorageStateChanged(String path, String oldState, String newState) {
            refresh();
            notifyStorageChanged(path,oldState,newState);
        }
    };

    public  void init(){
        Log.d(TAG,"  init .... ");
        refresh();
    }

    private void refresh(){

        storageVolumeAll.clear();
        storageVolumes = mStorageManager.getVolumeList();
        if(storageVolumes != null && storageVolumes.length>0){
            for(int i=0; i< storageVolumes.length ; i++){
                StorageVolume sv = storageVolumes[i];
                Log.d(TAG,"   ....storageVolumes[ "+i+"] = "+sv +" mfsUuid="+ sv.getUuid()+"  path="+ sv.getPath() +" label="+ sv.getDescription(this));
                File f =sv.getPathFile();
                if( f.exists()&& f.isDirectory() && f.canWrite()){
                    if(Environment.MEDIA_MOUNTED.equals(sv.getState())){
                        storageVolumeAll.add(sv);
                    }
                }
            }
            Log.d(TAG,"  storageVolumeAll  size="+ storageVolumeAll.size());
        }
    }

    public static List
       
       
         getStorageVolumes(){ return storageVolumeAll; } public static int getRootPath(String path){ if(storageVolumeAll.size()>0){ for(StorageVolume sv: storageVolumeAll){ String mPath = sv.getPath(); if(path!=null && path.equals(mPath)){ if(path.startsWith("/storage/emulated")){ return PHONE_ROOT; }else { DiskInfo di= mStorageManager.findVolumeByUuid(sv.getUuid()).getDisk(); if(di.isSd()){ return SD_ROOT; }else if(di.isUsb()){ return OTG_ROOT; } } } } } return NONE_ROOT; } public interface CallBackListener{ public void notifyStorageChanged(String path, String oldState, String newState); } private final Object sLock = new Object(); public void addCallBackListener(CallBackListener scl) { synchronized (sLock) { sListeners.add(scl); } } public void removeCallBackListener(CallBackListener scl) { synchronized (sLock) { sListeners.remove(scl); } } public void notifyStorageChanged(String path, String oldState, String newState) { synchronized (sLock) { for (CallBackListener l : sListeners) { l.notifyStorageChanged(path, oldState, newState); } } } } 
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值