android应用如何有效获取管理存储
来源:互联网 发布:吊炸天软件下载 编辑:程序博客网 时间:2024/05/17 23:30
注: 作者原创,转载请标明出处。
谷歌原生没有提供有效的获取内部存储、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 ListstorageVolumeAll = 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
- android应用如何有效获取管理存储
- 如何有效管理时间
- 如何有效管理时间
- 如何有效管理项目?
- 如何有效时间管理
- Android 手机 应用管理 中是如何获取到 应用信息的
- Android应用如何获取版本号
- Android 如何获取应用签名
- 如何更快速有效的收集Android应用的FPS
- 获取Android应用专属缓存存储目录
- 如何有效管理项目会议
- 管理中如何有效授权
- 如何有效的管理项目风险
- 如何有效的管理时间
- 如何有效管理工时 - 1
- 如何有效管理工时 - 2
- 如何有效管理项目会议
- 项目经理如何有效管理时间?
- Android精品源码与技术博文
- angular.js(Learner) 日志
- 在以太坊私有网络中建立节点集群,并发生交易
- 路由生产算法调研
- photoview实现图片双击放大缩小平移操作
- android应用如何有效获取管理存储
- Android之getSystemService
- SpringMVC实现文件上传
- 微信小程序怎么用?小程序有什么用?之501~600
- JAVA新手之路(持续更新)
- [Leetcode] 236. Lowest Common Ancestor of a Binary Tree 解题报告
- 中间件原理
- ionic2/3 MD5加密
- HTML <script> 标签的 src 属性