Android Work Profile Sandbox Policy 限制访问文件的权限

Posted

技术标签:

【中文标题】Android Work Profile Sandbox Policy 限制访问文件的权限【英文标题】:Android Work Profile Sandbox Policy restrict permissions to access files 【发布时间】:2019-08-03 20:43:54 【问题描述】:

我有一个使用 android 工作配置文件发布的 Android 应用程序。问题是该应用下载的所有文档都进入了工作资料的“下载”文件夹,其他应用没有权限。

如果我想从“下载”中打开图像/pdf 或任何其他文件,它会显示“无法打开文件”。问题是我的应用程序都无法启动打开图像或 pdf 的活动,因为启动新的视图活动需要系统的默认应用程序。

我如何设置策略以访问工作资料中的资源,而无需将它们移动到个人空间中?

我在 Google 管理员中找不到正确的设置,我需要以正确的方式解决这个问题。

所以,这是下载pdf的代码

 private void downloadPdf(View uiIcon, String branch, ProgressBar progressBar, String diferentiator) 
    uiIcon.setEnabled(false);
    final int orderIDbis = orderID;

    GetDataService downloadService = RetrofitClientInstance.createService(GetDataService.class);
    Call<ResponseBody> call = downloadService.directURLDownload(branch + orderID);
    call.enqueue(new Callback<ResponseBody>() 
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) 

            uiIcon.setVisibility(View.VISIBLE);
            progressBar.setVisibility(View.INVISIBLE);

            if (response.code() == 200) 
                File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) +
                        File.separator + "3dentaAdmin");
                if (!f.exists()) 
                    f.mkdir();
                
                String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) +
                        File.separator + "3dentaAdmin" + "/" + orderIDbis + "_" + diferentiator + ".pdf";
                fileToSave = new File(path);
                try 
                    fileToSave.createNewFile();
                    byte[] bytes = response.body().bytes();
                    Files.asByteSink(fileToSave).write(bytes);

                    openFileWithFileProvider("application/pdf");

                 catch (Exception e) 
                    e.printStackTrace();
                
                uiIcon.setEnabled(true);
             else 
                Toast.makeText(getApplicationContext(), "Nu s-a putut descarca", Toast.LENGTH_SHORT).show();
                uiIcon.setEnabled(true);
            
        

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) 
            Toast.makeText(getApplicationContext(), "Nu s-a putut descarca", Toast.LENGTH_LONG).show();
            uiIcon.setEnabled(true);
            uiIcon.setVisibility(View.VISIBLE);
            progressBar.setVisibility(View.INVISIBLE);
        
    );

而这段代码是用来打开文件的

private void openFileWithFileProvider(String fileType) 

    if (Build.VERSION.SDK_INT >= 24) 

        Intent install = new Intent(Intent.ACTION_VIEW);
        install.setDataAndType(FileProvider.getUriForFile(ActivityScannerResult.this, BuildConfig.APPLICATION_ID + ".provider", fileToSave), fileType);
        install.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(install);

     else 

        Intent install = new Intent(Intent.ACTION_VIEW);
        install.setDataAndType(Uri.fromFile(new File(fileToSave.getAbsolutePath())), fileType);
        install.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(install);

    


【问题讨论】:

向我们展示您用于下载文件的代码? 我已经在原始问题中添加了代码。 【参考方案1】:

问题是该应用下载的所有文档都进入了工作资料的“下载”文件夹,其他应用没有权限。

如果你下载到私有外部存储,你不会有这个问题吗?

https://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)

即使用getExternalFilesDir() 而不是getExternalStoragePublicDirectory()

返回主共享/外部存储设备上的目录的绝对路径,应用程序可以在其中放置其拥有的持久文件。这些文件在应用程序内部,通常不会作为媒体对用户可见。

根据我对 WorkProfile 的理解,应用程序是沙盒化的,不应允许从公共下载文件夹中打开文件。如果可能的话,它是工作资料的 IT 管理部门的决定,而不是单个应用程序中的权限。

我浏览了https://developers.google.com/android/work/requirements/work-profile,但一目了然找不到具体的报价来澄清这一点。

【讨论】:

以上是关于Android Work Profile Sandbox Policy 限制访问文件的权限的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用无法构建——依赖:androidx.work:work-runtime:2.7.0-beta01

Android 应用程序不会构建——在依赖项的 androidx.work:work-runtime:2.7.0-beta01 中指定的 minCompileSdk (31)

Android ListView onItemClick Not Work

Android Work Manager:如何每月将作业排入队列

从 Android for Work 应用程序访问 SD 卡数据

建立交叉编译环境