Android 6.0 权限

Android 6.0 Permissions

我正在从事一个代码库相当大的大项目。我想问你的是关于如何可靠地检查我必须在哪里提供适应 android 6.0 的解决方案的提示。我使用的是 Analyze > Inspect Code,它对代码进行静态分析,然后在该部分显示缺少的检查: 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

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

有趣的是,自 Android Lollipop 以来,"external storage" 与 "internal storage" 的定义发生了很大变化。这是什么意思?

此调用将要求您在外部 public 目录中具有存储权限:

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;
}

根据Google:

`如果 none 个预定义的子目录名称适合您的文件,您可以改为调用 getExternalFilesDir() 并传递 null。这 returns 是您应用程序在外部存储上的私有目录的根目录。

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

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