androidstudio安卓获取外部sd卡存储

摘要:
˃userEnvironment=类。姓名;MethodgetExternalDirs=用户环境。getDeclaredMethod;获取外部目录。setAccessible;//==========获取构造UserEnvironment所需的参数UserId===============类˂?
private static String getStoragePath(Context mContext, boolean is_removale) {

StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = null;
try {
path = (String) getPath.invoke(storageVolumeElement);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
if (is_removale == removable) {
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}



/**
* 6.0使用此方法获取外置SD卡路径,尝试过反射{@link StorageManager#getVolumeList}
* 但StorageVolume非Public API 编译不通过(7.0改为公开API),故使用UserEnvironment
* 的内部方法getExternalDirs获取所有的路径,通过{@link Environment#isExternalStorageRemovable(File)}
* 判断若removable则为外部存储
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
//@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private static String getPhysicalExternalFilePathAboveM(){
try {
//===========================获取UserEnvironment================
Class<?> userEnvironment = Class.forName("android.os.Environment$UserEnvironment");
Method getExternalDirs =userEnvironment.getDeclaredMethod("getExternalDirs");
getExternalDirs.setAccessible(true);
//========获取构造UserEnvironment的必要参数UserId================
Class<?> userHandle = Class.forName("android.os.UserHandle");
Method myUserId = userHandle.getDeclaredMethod("myUserId");
myUserId.setAccessible(true);
int mUserId = (int) myUserId.invoke(UserHandle.class);
Constructor<?> declaredConstructor = userEnvironment.getDeclaredConstructor(Integer.TYPE);
// 得到UserEnvironment instance
Object instance = declaredConstructor.newInstance(mUserId);
File[] files = (File[]) getExternalDirs.invoke(instance);
for (int i = 0; i < files.length; i++) {
if (Environment.isExternalStorageRemovable(files[i])){
return files[i].getPath();
}
}
} catch (Exception e) {

}
return "";
}

使用sd卡权限前请求权限
    public void getPermissions(){
if (Build.VERSION.SDK_INT >= 23) {
int REQUEST_CODE_PERMISSION_STORAGE = 100;
String[] permissions = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE//, "android.permission.WRITE_MEDIA_STORAGE"
};

this.requestPermissions(permissions,REQUEST_CODE_PERMISSION_STORAGE);

// for (String str : permissions) {
// if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
// this.requestPermissions(permissions, REQUEST_CODE_PERMISSION_STORAGE);
// return;
// }
// }
}
}

免责声明:文章转载自《androidstudio安卓获取外部sd卡存储》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件升级到k8s的17.0出现问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android模拟器使用SD卡

在Android手机上,所有的音乐、视频、图像文件都是存储在SD存储卡上的。但是如果想在Android模拟器上也同样能够存储这些内容,就必须先仿真SD存储卡,并让Android手机能够访问仿真出来的SD存储卡。Android SDK 组件的tools目录里,除了emulator这个运行文件外,另外放置mksdcard这个程序,它可以仿真出所需要的SD存储空...

安卓系统手机目录

一、文件夹 1./acct/    系统回收站,删除的系统文件。     2./cache/    缓存     3./data/    用户的所有程序相关数据     app/    所有用户安装的apk文件     app-private/     data/    每一个应用的数据         com.xx.appname/    每一个应用的数...

Android程序函数 将assets文件夹下的文件复制到手机的sd卡中(包括子文件夹)

最近在做个功能是将asset文件夹下的所有文件(包括子文件)全部拷贝出来到指定目录下。所用的方法无非是用AssetManager。但是这里有个问题是也要讲子文件夹和子文件都要拷贝出来。到网上Google了下,也到baidu搜索了下,发现了很多类似问题。但好像都有问题。显然只能做到将asset直接目录下的文件拷贝出来,但子文件夹拷贝不出来,而且,碰到文件夹,...

Android-SDCardUtil-工具类

SDCardUtil-工具类,是专门处理,外置存储Sdcard的操作 packagecommon.library.utils; importandroid.annotation.SuppressLint; importandroid.content.Context; importandroid.os.Environment; importandroid....

树莓派系统备份及还原

树莓派系统备份及还原 目前常见的备份方式是用Win32DiskImager进行全卡备份,该方法的缺点是备份文件会和SD卡的容量一致,而且在还原的时候必须使用比镜像更大容量的SD卡。 还有一种方式是压缩备份,是将需要备份的SD卡的内存压缩至树莓派使用的内存大小。方法是先在Linux环境中将 root分区拆分内容空间和空白空间,然后在Windows上用Win3...

重学STM32---(八)----SDIO

1.  SDIO(SD/SDIO MMC卡主机模块)在AHB外设总线和多媒体卡(MMC)、SD存储卡、SDIO卡和CE-ATA设备间提供了操作接口。(SDIO没有SPI兼容的通信模式 ) 1.1.什么是MMC卡 MMC:MMC就是MultiMediaCard的缩写,即多媒体卡。它是一种非易失性存储器件,体积小巧(24mm*32mm*1.4mm),容量大,耗...