棉花糖升级问题(外部SD卡)

时间:2016-02-10 17:49:01

标签: android android-sdcard android-6.0-marshmallow android-permissions

我已使用此论坛其他地方的指导更新了我的应用,以使用Android 6.0权限模型访问外部SD卡。虽然从新版本安装应用程序时应用程序/权限工作正常,但如果我从先前版本(依赖于AndroidManifest.xml中设置的权限)升级应用程序,应用程序将被拒绝访问SD卡 - 我需要卸载现有的版本并重新安装它以重新获得访问权限。

当我更换已经安装的应用版本时,有人可以解释为什么此应用更新会“破坏”外部SD卡权限吗?

我使用的代码(在我的MainActivity的onCreate方法中)是:

if (Build.VERSION.SDK_INT >= 23) {
    // For Marshmallow devices check permissions for accessing External SD card
    if (Build.VERSION.SDK_INT >= 23) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            logger.info("Permission is granted");
            return;
        } else {

            logger.info("Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        logger.info("Permission is granted");
        return;
    }
}

编辑: 当应用程序从Lollipop设备上的先前版本升级时,此代码返回“InvalidSourceFolder”:

File f = new File("/storage/external_SD/DCIM/Camera");
File file[] = f.listFiles();
//If file is null then the source folder isn't valid
if (file == null) {
    return "InvalidSourceFolder";
}

1 个答案:

答案 0 :(得分:0)

  

需要寻求什么权限才能读/写外部SD卡?

您无法读取/写入外部SD卡&#34;一般来说,从Android 4.4开始。

欢迎您在getExternalFilesDirs()上使用getExternalCacheDirs()getExternalMediaDirs()Context(请注明复数形式)。 如果设备已支持removable storage,则这些方法返回路径的第二个及后续条目将显示在removable storage上(您称之为&#34;外部SD)卡&#34)。使用这些目录不需要许可。

除此之外,您无法直接访问可移动存储的文件系统。主要的例外是早期版本的Android(例如Android 4.3)附带的设备,并升级到Android 4.4(或更高版本)。次要例外是Play Store不合法附带的设备。与合法拥有Play商店的Android 4.4+一起发布的设备无法在兼容性测试中提供对可移动媒体的直接文件系统访问。

请注意,您也可以使用存储访问框架(例如ACTION_OPEN_DOCUMENT)。这允许用户选择放置文件的位置,并且不仅支持可移动存储,还支持云存储服务(例如,Google Drive,Dropbox)。但是,您纯粹使用来自ContentResolver的流,而不是文件。