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:如何每月将作业排入队列