安卓获取机身内存和外部sdCard的方法及存储大小

偶然间,想到现在手机内存越来越大,外置的sdcard许多人都已经不用了,想具体看下安卓系统对获取sdcard以及机身内存的方法!以下为具体代码:
注意 :印象中记得,普通人们常叫的内存卡(sdcard),就是那个小黑卡,其实在安卓定义中:定义为外置的内存卡;而手机自带的内存被称为:sdcard;

下为具体代码:

根据传入的:is_removale的值不同,从而获得内置内存卡和外置内存卡

    /**
     * @param is_removale true 外置
     *                    false 内置
     *                    获取外置/内置内存卡的地址
     */
    public 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);
            Log.d("sss","---length--"+length);
            for (int i = 0; i < length; i++) {
                Object storageVolumeElement = Array.get(result, i);
                Log.d("sss","---Object--"+storageVolumeElement+"i=="+i);
                String path = (String) getPath.invoke(storageVolumeElement);
                Log.d("sss","---path_total--"+path);
                boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
                if (is_removale == removable) {
                    Log.d("sss","---path--"+path);
                    return path;
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

根据获取到的具体的内存卡,获取其大小,可用空间,存储单元的大小;

    /**
     * @param is_removale true 外置
     *                    false 内置
     *                    <p>
     *                    <p>
     *                    获取剩余内存
     */
    public String readSDCard(Context mcontext,Boolean is_removale) {
        DecimalFormat df = new DecimalFormat("0.00");
        if (getStoragePath(mcontext, is_removale) != null) {
            StatFs sf = new StatFs(getStoragePath(mcontext, is_removale));
            long blockSize;
            long blockCount;
            long availCount;
            if (Build.VERSION.SDK_INT > 18) {
                blockSize = sf.getBlockSizeLong(); //文件存储时每一个存储块的大小为4KB
                blockCount = sf.getBlockCountLong();//存储区域的存储块的总个数
                availCount = sf.getAvailableBlocksLong();//存储区域中可用的存储块的个数(剩余的存储大小)
            } else {
                blockSize = sf.getBlockSize();
                blockCount = sf.getBlockCount();
                availCount = sf.getAvailableBlocks();
            }
            Log.d("sss","总的存储空间大小:" + blockSize*blockCount/1073741824+"GB" + ",剩余空间:" + availCount * blockSize / 1073741824 + "GB"
            +"--存储块的总个数--"+blockCount+"--一个存储块的大小--"+blockSize/1024+"KB");
            return df.format((double) availCount * (double) blockSize / 1073741824);
        }
        return "-1";
    }

其中:

blockSize = sf.getBlockSizeLong(); //文件存储时每一个存储块的大小为4KB

这句中blockSize,个人水平有限,查阅源码注释,然后百度翻译了一下,认为(存储卡中被分为大小统一的存储单元,进行存储数据,而这个存储单元的大小为4096B,也就是4kb);
这样就完全解释通了,计算总的存储大小和剩余的存储大小,以及和手机机身内存和外置Sdcard大小比较,是完全相同的!

但是,自己在网上查阅资料时,看到了许多人写的获取内存卡的方法:
其中我们看这一条:

获取sdcard的大小:

    public void getTotalSdcardSize(){
        File sdcardDir = Environment.getExternalStorageDirectory();
        Log.d("sss","---mypath--sdcardDir--"+sdcardDir);
        StatFs sf = new StatFs(sdcardDir.getPath());
        Log.d("sss","---mystatFs--sdcardDir--"+sf);
        long blockSize = sf.getBlockSizeLong();
        long blockCount = sf.getBlockCountLong();
        long availCount = sf.getAvailableBlocksLong();
        long total = blockSize*blockCount;
        String toal = (total/1024/1024)+"M";
        System.out.println("---->"+"--size----"+toal);
        System.out.println("----->"+"--剩下size---"+(blockSize*availCount/1024/1024/1024)+"G");
    }

其次是获取机身的可用内存:

    /**
     * 获得机身可用内存
     * @return
     */
    private long getRomAvailableSize()
    {
        File path=Environment.getDataDirectory();
        Log.d("sss","---mypath----"+path);
        StatFs statFs=new StatFs(path.getPath());
        Log.d("sss","---mystatFs----"+statFs);
        long blockSize=statFs.getBlockSizeLong();
        long availableBlocks=statFs.getAvailableBlocksLong();
        System.out.println("----->"+"--得机身可用内存---"+(blockSize*availableBlocks/1024/1024/1024)+"G");
        return blockSize*availableBlocks;

    }

仔细看两种获取 path 的方式:

String state = Environment.getExternalStorageState();

File path=Environment.getDataDirectory();

但是这两种获取到的内存大小和剩余内存都是相同的,

07-31 17:15:28.175 1010-1010/com.albb.myzoomimage I/System.out: ----->--获得机身内存大小---25G
07-31 17:15:28.175 1010-1010/com.albb.myzoomimage D/sss: ---mypath----/data
07-31 17:15:28.175 1010-1010/com.albb.myzoomimage D/sss: ---mystatFs----android.os.StatFs@87abb8a
07-31 17:15:28.175 1010-1010/com.albb.myzoomimage I/System.out: ----->--得机身可用内存---9G

很奇怪啊,还有这种操作,后来又百度了一下,看到了下面两篇文章,算是彻底明白了,原来安卓的内存分为三部分:
1,手机自带的内存(其中分为两部分:系统所占内存 + 手机除去系统所占内存剩余的内存,其中“手机除去系统所占内存剩余的内存”被安卓默认为:手机自带sdcard)
2,插入的内存卡(sdcard)

详情请看:

文章链接1:文章一

文章2:文章二

以及参考文章:参考链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值