Android sd卡的一些操作

Android sd卡的操作

Android的外置SD卡一般的通过Environment或者Context获取的都是手机自带的存储卡路径,类似storage/emulated/0/加后缀。国内的厂商一般都支持外置USB或者外置可移动SD存储,但是国外就不一定了。我们可以通过StorageManager来对外置卡进行一些操作。

获取内部存储的空间

通过StorageManager我们可以获取到磁盘的卷列表,由于getVolumeList(6.0以前) 、getVolumes(6.0以后)方法是hide的,所以我们需要使用到反射。

  //5.0 查外置存储
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
 long totalReturnSize = 0L;
 int version = Build.VERSION.SDK_INT;
 if (version < Build.VERSION_CODES.M) {//小于6.0
            try {
                Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
                StorageVolume[] volumeList = (StorageVolume[]) getVolumeList.invoke(storageManager);
                long totalSize = 0, availableSize = 0;
                if (volumeList != null) {
                    Method getPathFile = null;
                    for (StorageVolume volume : volumeList) {
                        if (getPathFile == null) {
                            getPathFile = volume.getClass().getDeclaredMethod("getPathFile");
                        }
                        File file = (File) getPathFile.invoke(volume);
                        totalSize += file.getTotalSpace();
                        availableSize += file.getUsableSpace();
                    }
                }
                totalReturnSize = totalSize;
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } else {

            try {
                Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");//6.0
                List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);
                long total = 0L, used = 0L;
                for (Object obj : getVolumeInfo) {
                    Field getType = obj.getClass().getField("type");
                    int type = getType.getInt(obj);
                    Log.d( "TAG","type: " + type);
                    if (type == 1) {//TYPE_PRIVATE
                        long totalSize = 0L;
                        //获取内置内存总大小
                        if (version >= Build.VERSION_CODES.O) {//8.0
                            unit = 1000;
                            Method getFsUuid = obj.getClass().getDeclaredMethod("getFsUuid");
                            String fsUuid = (String) getFsUuid.invoke(obj);
                            totalSize = getTotalSize(context, fsUuid);//8.0 以后使用
                        } else if (version >= Build.VERSION_CODES.N_MR1) {//7.1.1
                            Method getPrimaryStorageSize = StorageManager.class.getMethod("getPrimaryStorageSize");//5.0 6.0 7.0没有
                            totalSize = (long) getPrimaryStorageSize.invoke(storageManager);
                        }
                        long systemSize = 0L;
                        Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
                        boolean readable = (boolean) isMountedReadable.invoke(obj);
                        if (readable) {
                            Method file = obj.getClass().getDeclaredMethod("getPath");
                            File f = (File) file.invoke(obj);
                            if (totalSize == 0) {
                                totalSize = f.getTotalSpace();
                            }
                            systemSize = totalSize - f.getTotalSpace();
                            used += totalSize - f.getFreeSpace();
                            total += totalSize;
                        }
                        totalReturnSize = totalSize;
                    } else if (type == 0) {//TYPE_PUBLIC
                        //外置存储
                        Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
                        boolean readable = (boolean) isMountedReadable.invoke(obj);
                        if (readable) {
                            Method file = obj.getClass().getDeclaredMethod("getPath");
                            File f = (File) file.invoke(obj);
                            used += f.getTotalSpace() - f.getFreeSpace();
                            total += f.getTotalSpace();
                        }
                    } else if (type == 2) {//TYPE_EMULATED

                    }
                }
                totalReturnSize = total;
            } catch (SecurityException e) {
                Log.e("TAG", "Permission denied: permission.PACKAGE_USAGE_STATS");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

         Log.i("totalReturnSize ",Math.abs(totalReturnSize )+"");

获取内部存储可用大小

//5.0 查外置存储
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
        float unit = 1024;
        long totalReturnSize = 0L;
        long freeReturnSize = 0L;
        int version = Build.VERSION.SDK_INT;
        if (version < Build.VERSION_CODES.M) {//小于6.0
            try {
                Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
                StorageVolume[] volumeList = (StorageVolume[]) getVolumeList.invoke(storageManager);
                long totalSize = 0, availableSize = 0;
                if (volumeList != null) {
                    Method getPathFile = null;
                    for (StorageVolume volume : volumeList) {
                        if (getPathFile == null) {
                            getPathFile = volume.getClass().getDeclaredMethod("getPathFile");
                        }
                        File file = (File) getPathFile.invoke(volume);
                        totalSize += file.getTotalSpace();
                        availableSize += file.getUsableSpace();
                    }
                }
                totalReturnSize = totalSize;
                freeReturnSize = availableSize;
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } else {

            try {
                Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");//6.0
                List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);
                long total = 0L, used = 0L;
                for (Object obj : getVolumeInfo) {

                    Field getType = obj.getClass().getField("type");
                    int type = getType.getInt(obj);

                    Log.d("TAG", "type: " + type);
                    if (type == 1) {//TYPE_PRIVATE

                        long totalSize = 0L;

                        //获取内置内存总大小
                        if (version >= Build.VERSION_CODES.O) {//8.0
                            unit = 1000;
                            Method getFsUuid = obj.getClass().getDeclaredMethod("getFsUuid");
                            String fsUuid = (String) getFsUuid.invoke(obj);
                            totalSize = getTotalSize(context, fsUuid);//8.0 以后使用
                        } else if (version >= Build.VERSION_CODES.N_MR1) {//7.1.1
                            Method getPrimaryStorageSize = StorageManager.class.getMethod("getPrimaryStorageSize");//5.0 6.0 7.0没有
                            totalSize = (long) getPrimaryStorageSize.invoke(storageManager);
                        }
                        long systemSize = 0L;

                        Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
                        boolean readable = (boolean) isMountedReadable.invoke(obj);
                        if (readable) {
                            Method file = obj.getClass().getDeclaredMethod("getPath");
                            File f = (File) file.invoke(obj);

                            if (totalSize == 0) {
                                totalSize = f.getTotalSpace();
                            }
                            systemSize = totalSize - f.getTotalSpace();
                            used += totalSize - f.getFreeSpace();
                            total += totalSize;
                        }
                        totalReturnSize = totalSize;
                        freeReturnSize = totalSize - used;

                    } else if (type == 0) {//TYPE_PUBLIC
                        //外置存储
                        Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
                        boolean readable = (boolean) isMountedReadable.invoke(obj);
                        if (readable) {
                            Method file = obj.getClass().getDeclaredMethod("getPath");
                            File f = (File) file.invoke(obj);
                            used += f.getTotalSpace() - f.getFreeSpace();
                            total += f.getTotalSpace();
                        }
                    } else if (type == 2) {//TYPE_EMULATED

                    }
                }
                totalReturnSize = total;
                freeReturnSize = total - used;

            } catch (SecurityException e) {
                Log.e("TAG", "Permission denied: permission.PACKAGE_USAGE_STATS");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
         Log.i("freeReturnSize ",Math.abs(freeReturnSize)+"");

获取外部存储空间

 //5.0 查外置存储
long total = 0, availableSize = 0;
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
float unit = 1000;
int version = Build.VERSION.SDK_INT;
if (version < Build.VERSION_CODES.M) {//小于6.0
                try {
                    Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
                    StorageVolume[] volumeList = (StorageVolume[]) getVolumeList.invoke(storageManager);

                    if (volumeList != null) {
                        Method getPathFile = null;
                        for (StorageVolume volume : volumeList) {
                            if (getPathFile == null) {
                                getPathFile = volume.getClass().getDeclaredMethod("getPathFile");
                            }
                            File file = (File) getPathFile.invoke(volume);
                            total += file.getTotalSpace();
                            availableSize += file.getUsableSpace();
                        }
                    }
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } else {

                try {
                    Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");//6.0
                    List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);

                    for (Object obj : getVolumeInfo) {

                        Field getType = obj.getClass().getField("type");
                        int type = getType.getInt(obj);

                        Log.d("TAG", "type: " + type);
                        if (type == 0) {//TYPE_PUBLIC
                            //外置存储
                            Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
                            boolean readable = (boolean) isMountedReadable.invoke(obj);
                            if (readable) {
                                Method file = obj.getClass().getDeclaredMethod("getPath");
                                File f = (File) file.invoke(obj);
                                availableSize += f.getFreeSpace();
                                total += f.getTotalSpace();
                            }

                        }
                        else if (type == 2) {//TYPE_EMULATED

                        }
                    }
                } catch (SecurityException e) {
                    Log.e("TAG", "Permission denied: permission.PACKAGE_USAGE_STATS");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            Log.i("total",total+"");

获取外部已用空间

//5.0 查外置存储
long total = 0, availableSize = 0;
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
 float unit = 1000;
 int version = Build.VERSION.SDK_INT;
if (version < Build.VERSION_CODES.M) {//小于6.0
                try {
                    Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
                    StorageVolume[] volumeList = (StorageVolume[]) getVolumeList.invoke(storageManager);

                    if (volumeList != null) {
                        Method getPathFile = null;
                        for (StorageVolume volume : volumeList) {
                            if (getPathFile == null) {
                                getPathFile = volume.getClass().getDeclaredMethod("getPathFile");
                            }
                            File file = (File) getPathFile.invoke(volume);
                            total += file.getTotalSpace();
                            availableSize += file.getUsableSpace();
                        }
                    }
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } else {

                try {
                    Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");//6.0
                    List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);

                    for (Object obj : getVolumeInfo) {

                        Field getType = obj.getClass().getField("type");
                        int type = getType.getInt(obj);

                        Log.d("TAG", "type: " + type);
                        if (type == 0) {//TYPE_PUBLIC
                            //外置存储
                            Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
                            boolean readable = (boolean) isMountedReadable.invoke(obj);
                            if (readable) {
                                Method file = obj.getClass().getDeclaredMethod("getPath");
                                File f = (File) file.invoke(obj);
                                availableSize += f.getFreeSpace();
                                total += f.getTotalSpace();
                            }

                        }
                    }
                } catch (SecurityException e) {
                    Log.e("TAG", "Permission denied: permission.PACKAGE_USAGE_STATS");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            Log.i("restSize",total - availableSize);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值