android获取sd卡,安卓手机如何读取外置sd卡

Android 6.0 读写SD卡权限问题

Android 6.0 下默认存储SD卡,使用原生FMRadio生成的文件保存到内部存储中

创新互联公司专业为企业提供盐山网站建设、盐山做网站、盐山网站设计、盐山网站制作等企业网站建设、网页设计与制作、盐山企业网站模板建站服务,10余年盐山做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

【预置条件】插入T卡【操作步骤】设置存储设备和USB选择SD卡为默认存储收音机录音【实际结果】收音机的录音文件未保存到T卡【预期结果】收音机的录音文件保存到T卡【复现概率】10/10

此外,SoundRecorder默认存储SD卡,生成的文件却可以保存到SD卡中

1、收音机文件没有保存到指定的SD卡目录下,因此可能是文件的路径不对。

2、进入设置中,切换默认存储位置,内部存储或者SD卡,每次切换都会修改系统中某一属性值。

3、当收音机文件保存的时候,必须要读取当前系统的默认存储路径,然后生成自己的文件路径。

STEP1、初步解决方案,但没有生效,引入新问题

对比 SoundRecorder ,根据GIT库中,之前的同事的修改记录,找到可能的解决方案,修改如下:

引入新的问题,此时,点击 Start Recording 会提示内部错误。

分析Log发现,由于权限拒绝,抛出IO异常

01-01 07:35:38.167 7467 7467 W System.err: java.io .IOException: open failed: EACCES (Permission denied)

STEP2、Android M 下SD卡读写权限问题

分析由于权限问题后,结合Android M new design,开始查找文档,寻找解决Android M 下SD卡读写权限问题

Android6.0中的运行时请求权限

后来,试了好几种方法,但都没有用,以及报问题“EACCES (Permission denied)”

STEP3、再分析可能是运行时权限问题

判断APP运行时权限如下:

发现此时,FMRadio对于的组权限如下:

com.android.fmradio Groups: 1013 3002 3003 9997 50010

com.android.soundrecorder Groups: 1015 1023 3003 9997 50105

根据 系统权限 的定义,有兴趣的同学可以去看一下这个文件 system/core/include/private/android_filesystem_config.h

分析这些Gid发现:

1015 为sdcard_rw,1023 为media_rw权限

因此,得出结论如下

1、首先修改AndroidManifest.xml文件,新增权限,确保FMRadio应用级的权限;

2、原生FMRadio使用过程中,会进行运行时的权限检查,故FMRadio运行时应该拿到了WRITE_EXTERNAL_STORAGE,以及READ_EXTERNAL_STORAGE权限,

3、但是由于FMRadio本身不具备“1015,1023”组权限,这些权限无效,仍然无法对SD卡进行读写操作。

STEP4、最终解决方案

在 STEP1 的修改基础上,在框架层,权限对应组中给予FMRadio相应的组权限,新增修改如下:

frameworks/base/data/etc/platform.xml

重编framework.jar, 将修改后的jar文件push到手机,重启

此时,再检查FMRadio对于的组权限如下:

com.android.fmradio Groups: 1013** 1015 1023** 3002 3003 9997 50010

到此为止,

Android开发中,获取U盘或SD卡路径。

@SuppressLint("PrivateApi")

private String getStoragePath(Context context, boolean isUsb){

    String path="";

    StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);

    Class? volumeInfoClazz;

    Class? diskInfoClaszz;

    try {

        volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo");

        diskInfoClaszz = Class.forName("android.os.storage.DiskInfo");

        Method StorageManager_getVolumes=Class.forName("android.os.storage.StorageManager").getMethod("getVolumes");

        Method VolumeInfo_GetDisk = volumeInfoClazz.getMethod("getDisk");

        Method VolumeInfo_GetPath = volumeInfoClazz.getMethod("getPath");

        Method DiskInfo_IsUsb = diskInfoClaszz.getMethod("isUsb");

        Method DiskInfo_IsSd = diskInfoClaszz.getMethod("isSd");

        ListObject List_VolumeInfo = (ListObject) StorageManager_getVolumes.invoke(mStorageManager);

        assert List_VolumeInfo != null;

        for(int i=0; iList_VolumeInfo.size(); i++){

            Object volumeInfo = List_VolumeInfo.get(i);

            Object diskInfo = VolumeInfo_GetDisk.invoke(volumeInfo);

            if(diskInfo==null)continue;

            boolean sd= (boolean) DiskInfo_IsSd.invoke(diskInfo);

            boolean usb= (boolean) DiskInfo_IsUsb.invoke(diskInfo);

            File file= (File) VolumeInfo_GetPath.invoke(volumeInfo);

            if(isUsb == usb){//usb

                assert file != null;

                path=file.getAbsolutePath();

            }else if(!isUsb == sd){//sd

                assert file != null;

                path=file.getAbsolutePath();

            }

        }

    } catch (Exception e) {

        YYLog.print(TAG, "[——————— ——————— Exception:"+e.getMessage()+"]");

        e.printStackTrace();

    }

    return path;

}

安卓手机如何读取外置sd卡

系统会自动读取插入的外置sd卡里的文件内容,你打开手机的文件管理器,在文件类型栏里点任意一种类型,比如视频,你就能看到sd卡里所有的视频文件了。


本文名称:android获取sd卡,安卓手机如何读取外置sd卡
链接地址:http://myzitong.com/article/phseph.html