安卓 6.0 棉花糖。无法写入 SD 卡

标签 android android-sdcard android-6.0-marshmallow

我有一个使用外部存储来存储照片的应用程序。根据需要,在其 list 中请求以下权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

它使用以下内容来检索所需的目录

File sdDir = Environment
            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd", Locale.US);
String date = dateFormat.format(new Date());
storageDir = new File(sdDir, getResources().getString(
            R.string.storagedir)
            + "-" + date);

// Create directory, error handling
if (!storageDir.exists() && !storageDir.mkdirs()) {
 ... fails here

该应用在 Android 5.1 到 2.3 上运行良好;它已经在 Google Play 上架了一年多。

在我的一部测试手机(Android One)升级到 6 之后,它现在在尝试创建必需目录“/sdcard/Pictures/myapp-yy-mm”时返回错误。

SD卡配置为“可移植存储”。我已经格式化了sd卡。我已经更换了它。我已经重启了。一切都无济于事。

此外,内置的 android 屏幕截图功能(通过 Power+Lower 音量)失败,“由于存储空间有限,或者应用程序或您的组织不允许这样做”。

有什么想法吗?

最佳答案

我遇到了同样的问题。 Android中有两种权限:

  • 危险(访问联系人、写入外部存储...)
  • 正常

普通权限由 Android 自动批准,而危险权限需要 Android 用户批准。

这是在 Android 6.0 中获取危险权限的策略

  1. 检查您是否获得了权限
  2. 如果您的应用已获得权限,请继续并正常执行。
  3. 如果您的应用还没有权限,请请求用户批准
  4. 在 onRequestPermissionsResult 中听取用户批准

这是我的情况:我需要写入外部存储。

首先,我检查我是否有权限:

...
private static final int REQUEST_WRITE_STORAGE = 112;
...
boolean hasPermission = (ContextCompat.checkSelfPermission(activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
    ActivityCompat.requestPermissions(parentActivity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
}

然后检查用户是否认可:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }

}

您可以在此处阅读有关新权限模型的更多信息:https://developer.android.com/training/permissions/requesting.html

关于安卓 6.0 棉花糖。无法写入 SD 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33139754/

相关文章:

android - android :collapseColumns and android:shrinkColumns of tableLayout之间的区别

android - 如何将jpg图片保存到sd卡中自己的目录

java - 如何利用GPS精确计算速度和距离?跟踪用户位置。用于运行的应用程序

android - 在 Android 上加载文件

移动品牌中的 Android 外部存储

sd卡上的Android KitKat 4.4文件夹

java - 仅在 Android 6.0 中没有此类文件或目录

android - 带有附件的邮件的 RecyclerView 无法正确显示附件

android-intent - 通过 Intent : SecurityException 发送电子邮件

android - 如何区分进入 Doze 维护窗口和退出 Doze 的设备