Android 6.0权限

时间:2015-09-21 08:21:24

标签: android android-6.0-marshmallow

我正在开发一个具有相当大代码库的大项目。我想问你的是如何可靠地检查我必须提供适应Android 6.0的解决方案的提示。我使用的是Analyze>检查代码,它对代码进行静态分析,并在部分中显示缺少的检查: Android>常量和资源类型不匹配。它看起来有点不是找到那些问题的正确位置,这就是为什么我要确保我正在使用正确的东西并且正在寻找正确的东西,加上我有点困惑,因为我有部分代码写入文件我没有得到有关权限检查的通知(这是正常的行为吗?!)

public static boolean write(String folderName, String filename, Object objToWrite) {
    // serialize cardModel
    FileOutputStream file = null;
    ObjectOutputStream o = null;
    File dirFile = AppController.getInstance().getApplicationContext().getDir(folderName, Context.MODE_PRIVATE);
    try {
        // Create archiveDir
        File mypath = new File(dirFile, filename);
        file = new FileOutputStream(mypath, false);
        o = new ObjectOutputStream(file);
        o.writeObject(objToWrite);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            o.close();
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    return true;
}

我是否应该在此处收到写入权限的警告?

让我问的另一件事就是我在google上发布的有关Android Studio错误的问题: Android Studio Bug

2 个答案:

答案 0 :(得分:2)

并非每次写入文件都需要权限 - 只有一次写入外部存储 - 此功能也可能写入应用程序文件空间 - 这不需要权限。取决于参数

答案 1 :(得分:0)

有趣的是,自Android Lollipop以来,“外部存储”与“内部存储”的定义发生了很大变化。这是什么意思?

此调用将要求您在外部公共目录中拥有存储权限:

public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory.
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

但是,如果您执行以下操作,则不需要存储权限。

public File getAlbumStorageDir(Context context, String albumName) {
    // Get the directory for the app's private pictures directory.
    File file = new File(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

根据谷歌的说法:

`如果没有预定义的子目录名适合您的文件,则可以调用getExternalFilesDir()并传递null。这将返回外部存储上应用程序私有目录的根目录。

请记住,getExternalFilesDir()会在用户卸载应用程序时删除目录中的目录。如果您保存的文件在用户卸载应用程序后仍然可用 - 例如当您的应用程序是相机并且用户想要保留照片时 - 您应该使用getExternalStoragePublicDirectory()。

无论您对共享文件使用getExternalStoragePublicDirectory()还是对应用程序专用的文件使用getExternalFilesDir(),都必须使用API​​常量(如DIRECTORY_PICTURES)提供的目录名称。这些目录名称确保系统正确处理文件。例如,保存在DIRECTORY_RINGTONES中的文件被系统媒体扫描仪分类为铃声而不是音乐。 `