Android SD卡

 2023-09-05 阅读 57 评论 0

摘要:2019独角兽企业重金招聘Python工程师标准>>> 一.获取SDCard路径 sd卡的路径可以通过Environment.getExternalStorageDirectory()来获取,但是一些高级的手机或者是手持pad都会内置一个sdcard。另外扩展卡上还有一个,使用Environment.getExternalStorag

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一.获取SDCard路径

sd卡的路径可以通过Environment.getExternalStorageDirectory()来获取,但是一些高级的手机或者是手持pad都会内置一个sdcard。另外扩展卡上还有一个,使用Environment.getExternalStorageDirectory()这个方法只可以获得内置的,如果要是把外置路径给写死了的话也不行,经过我测试之后不同的设备对外置路径是不一样的,比如LG一款mnt/sdcard/_ExternalSD。

下面有2种方法:

1.写一个广播来监听sdcard是否拔插来获得外置sdcard路径

IntentFilter intentFilter = new IntentFilter();// sd卡被插入,且已经挂载
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addDataScheme("file");

    注册监听函数

registerReceiver(sdcardRec, intentFilter);// 注册监听函数
public class SDcaedReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {intent.getData().getPath();//外置设备路径}
}

得到外置路径之后将其存储在数据库中

2.系统角度想到的解决办法

public String getExterPath() {//得到路径try {Runtime runtime = Runtime.getRuntime();Process proc = runtime.exec("mount");InputStream is = proc.getInputStream();InputStreamReader isr = new InputStreamReader(is);String line;BufferedReader br = new BufferedReader(isr);while ((line = br.readLine()) != null) {if (line.contains("secure")) continue;if (line.contains("asec")) continue;if (line.contains("fat")) {String columns[] = line.split(" ");if (columns != null && columns.length > 1) {sdcard_path = sdcard_path.concat("*" + columns[1]);}} else if (line.contains("fuse")) {String columns[] = line.split(" ");if (columns != null && columns.length > 1) {sdcard_path = sdcard_path.concat(columns[1]);}}}} catch (Exception e) {e.printStackTrace();}return sdcard_path;
}

如果需要获得外置sd卡中的资源时,最好的解决方案就是把这两个方法结合起来,插入外置的时候读取sd卡中的文件,没有外置设备的时候读取内置sd卡中的文件。


二.一些路径的标准写法

Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache
Environment.getExternalStorageDirectory() = /mnt/sdcard
Environment.getRootDirectory() = /system
context.getCacheDir() = /data/data/com.mt.mtpp/cache
context.getExternalCacheDir() = /mnt/sdcard/Android/data/com.mt.mtpp/cache
context.getFilesDir() = /data/data/com.mt.mtpp/files


三.判断双SD卡,并显示各个SD卡的剩余空间

public void getSCardInfo(){StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);try {Class<?>[] paramClasses = {};Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths", paramClasses);getVolumePathsMethod.setAccessible(true);Object[] params = {};Object invoke = getVolumePathsMethod.invoke(storageManager, params);for (int i = 0; i < ((String[]) invoke).length; i++) {StatFs stat = getStatFs(((String[]) invoke)[i]);Toast.makeText(MainActivity.this,((String[])invoke)[i] + "剩余空间:" + calculateSizeInMB(stat), Toast.LENGTH_SHORT).show();}} catch (NoSuchMethodException e1) {e1.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
}
private StatFs getStatFs(String path) {try {return new StatFs(path);} catch (Exception e) {e.printStackTrace();}return null;
}
private float calculateSizeInMB(StatFs stat) {if (stat != null)return stat.getAvailableBlocks() * (stat.getBlockSize() / (1024f * 1024f));return 0.0f;
}

转载于:https://my.oschina.net/u/2320057/blog/632765

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/1216.html

上一篇:线 条
下一篇:C# 常用代码

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息