3

我正在触发相机意图以使用相机应用程序拍照。它在我的默认应用程序版本中按预期工作。

我已经为"Android for Work"我的应用程序版本实现了相同的代码,但最终出现了奇怪的行为。通常,根据"Android for Work"视频,如果 Intent 位于不同的配置文件中,则无法处理它。例如,如果我的工作配置文件中没有安装相机应用程序,则相机意图在解决后应该为空,这是预期的。

但在我的情况下,相机意图由安装在我的默认用户配置文件中的相机应用程序处理(Work Profile没有相机应用程序)。拍摄照片时,它会返回onActivityResult一个resultCode Activity.RESULT_CANCELED.

所以,我的问题是,我怎样才能区分用户Real Cancel Event和这种情况?两者的结果是一样的,Activity.RESULT_CANCELED

这是下面的代码,显示了我如何触发相机意图。

/* Create Camera Intent */
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

/* Check if the Camera Intent is Available */
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) == null) {

    /* Notify User in Error Case */
    UIUtils.notifyUser(getActivity(), getString(R.string.error), getString(R.string.no_camera_application_found));

} else {

    /* Create a new File with Random Photo Name */
    takenPhoto = new File(FileUtils.getExternalPhotoCacheDirectory(), generatePhotoName());
    takenPhoto.createNewFile();

    /* Create Uri to send to within the Intent */
    Uri outputFileUri = Uri.fromFile(takenPhoto);

    /* Set Photo destination File Uri */
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

    /* Start Activity for Result */
    startActivityForResult(cameraIntent, ACTION_TAKE_PHOTO);
 }

编辑:这里有一些来自我的管理面板的屏幕截图。 交叉配置文件限制 工作资料中允许的应用程序

4

1 回答 1

1

根据DevicePolicyManager的setCameraDisabled()方法:

由管理设备的应用程序调用,以为此用户禁用设备上的所有摄像头。设置后,以该用户身份运行的应用程序将无法访问设备上的任何摄像头。

因此,只有在工作配置文件上运行的应用程序将无法访问相机 - 正如它所读取的那样,这不会影响默认用户配置文件。

管理应用程序需要使用 FLAG_PARENT_CAN_ACCESS_MANAGED 调用addCrossProfileIntentFilter ()以禁用工作配置文件应用程序的意图,如果他们不希望任何意图从工作配置文件发送给用户,则可以在父(默认用户)应用程序上解析轮廓。

现在,如果您希望您的应用ACTION_IMAGE_CAPTURE用于处理工作资料,您可以按照以下说明进行操作:

Android 上的每个用户都有一个完全沙盒化的存储空间,包括公共存储目录。这意味着默认用户配置文件相机应用程序无法读取工作配置文件应用程序可访问的任何文件目录。

相反,您需要提供他们可以写入的 URI,例如FileProvider返回的 URI,如文件共享培训中所述。

/* Create a new File with Random Photo Name */
takenPhoto = new File(getActivity().getCacheDir(), generatePhotoName());
takenPhoto.createNewFile();

/* Create Uri to send to within the Intent */
Uri outputFileUri = FileProvider.getUriForFile(getActivity(),
    "your.authority.read.the.docs", takenPhoto);

/* Set Photo destination File Uri */
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

需要注意的是,此处的文件被保存到应用程序的缓存目录中,而不是公共存储位置。

您还需要包括基于 Uri 的权限:

cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
cameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
cameraIntent.setClipData(ClipData.newRawUri(null, outputFileUri));

通常,只有包含在其中的 UrisetData(uri)被授予权限,但也包含在剪辑数据中的任何 Uri 也将被授予权限,从而允许相机应用程序读取和写入您的MediaStore.EXTRA_OUTPUTUri。

于 2015-10-16T20:29:25.110 回答