作为开发人员对 Android 上的文件和媒体权限的担忧

Posted

技术标签:

【中文标题】作为开发人员对 Android 上的文件和媒体权限的担忧【英文标题】:Concerns about the FILES AND MEDIA PERMISSIONS on Android as a developer 【发布时间】:2021-12-29 01:49:00 【问题描述】:

我正在开发一个将数据保存到数据库中的应用程序,我正在尝试备份和恢复我能够执行的数据库,我的问题是 API30+ 上的“不祥”权限弹出窗口

Allow management of all files

Allow this app to access modify and delete files on your device.....

是否允许此应用访问、修改和删除设备或任何连接的存储设备上的文件?此应用可能会在不询问您的情况下访问文件。

我不想做任何这些事情,我只是想要获得执行备份/恢复事情的权限

这是我请求权限的代码:

    private void requestStoragePermissionExport()
        if( (Build.VERSION.SDK_INT  >= 30 ))
            try 
                Intent intent = new Intent(Manifest.permission.MANAGE_EXTERNAL_STORAGE);
                intent.addCategory("android.intent.category.DEFAULT");
                intent.setData(Uri.parse(String.format("package:%s",getApplicationContext().getPackageName())));
                startActivityForResult(intent, 2296);
             catch (Exception e) 
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivityForResult(intent, 2296);
            
        else
            ActivityCompat.requestPermissions(this, new String[]
                    Manifest.permission.WRITE_EXTERNAL_STORAGE, BACKUP_CODE);
        
    

有没有更好的方法来处理这个问题?

【问题讨论】:

为什么需要该权限来备份数据库? db 是您空间中的文件,您不需要任何权限即可访问它。 也许您可以选择共享数据库?使用 Android Sharesheet 并允许您的用户将文件导出到外部。 @FilipPetrovski 所以如果他们的用户自己导出/导入权限就不需要了吗? 【参考方案1】:

Google 正在限制使用广泛的文件权限,例如 MANAGE_EXTERNAL_STORAGE。您可以使用存储访问框架来获得对某些文件或目录的有限访问权限。

// Request code for selecting a PDF document.
const val PICK_PDF_FILE = 2

fun openFile(pickerInitialUri: Uri) 
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply 
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/pdf"

        // Optionally, specify a URI for the file that should appear in the
        // system file picker when it loads.
        putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
    

    startActivityForResult(intent, PICK_PDF_FILE)

或者如果你想访问整个目录;

fun openDirectory(pickerInitialUri: Uri) 
    // Choose a directory using the system's file picker.
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply 
        // Optionally, specify a URI for the directory that should be opened in
        // the system file picker when it loads.
        putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
    

    startActivityForResult(intent, your-request-code)

您可以访问的路径有一些限制。你可以在这里读更多关于它的内容 https://developer.android.com/training/data-storage/shared/documents-files

【讨论】:

【参考方案2】:

您可以将您的 db 文件备份到公共 Documents 目录。

不需要你提到的权限。

【讨论】:

【参考方案3】:

好吧,经过一番research,我发现最适合自己的解决方案如下:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) + File.separator + "foldername"

这不需要权限,适用于 API 30 以下和以上的版本

【讨论】:

以上是关于作为开发人员对 Android 上的文件和媒体权限的担忧的主要内容,如果未能解决你的问题,请参考以下文章

android 内部文件读取

防止媒体扫描,设置权限或锁定android中的文件夹和文件

用于 Android Q 上的辅助存储的媒体扫描仪

Android高级终端开发学习笔记(《疯狂Android讲义》第11章-第17章)

androidstudio对项目文件没有访问权限

对Android系统权限的认识