小米开发平台 双开应用修改头像失败等场景适配说明
背景
在Android 11及以上版本,当应用双开后,双开应用中启动系统剪裁页面,实现修改APP打包网址头像等场景时,会出现剪裁保存图片失败问题。此场景需要应用适配双开。
应用双开功能
手机设置-应用设置-应用双开
适配说明
在应用启动剪裁页面时,intent中放入的输出路径的uri需要带上userId,具体如下:
/**
* 反射获取getCallingUserId
*/
private int getCallingUserId(){
Class UserHandleClass = UserHandle.class;
int userId = 0;
try {
userId = (int)UserHandleClass.getMethod("getCallingUserId").invoke(UserHandleClass);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e){
e.printStackTrace();
}
return userId;
}
/**
* @param uri: 需要剪裁uri,如图库等返回的uri
* 拉起系统剪裁页面
*/
private void cropImage(Uri uri) {
if(uri == null) {
return;
}
Intent intent = new Intent("com.android.camera.action.CROP");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.putExtra("scale"生成网站APP, true);
intent.putExtra("aspectX", XXX);
intent.putExtra("aspectY", XXX);
intent.putExtra("outputX", XXX);
intent.putExtra("outputY", XXX);
intent.putExtra("outputFormat", XXX);
intent.putExtra("return-data", XXX);
File tmpFile = new File(getExternalFilesDir(null), System.currentTimeMillis()+".jpg");
try {
tmpFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
Uri mCutUri = FileProvider.getUriForFile(MainActivity.this,
"com.xxx.fileprovider", tmpFile);
//生成带userId的uri
Uri.Builder builder = mCutUri.buildUpon();
Uri newUri = builder.encodedAuthority("" + getCallingUserId() + "@" + mCutUri.getEncodedAuthority()).build();
intent.putExtra(MediaStore.EXTRA_OUTPUT, newUri);
//调用grantUriPermission给newUri授权
grantUriPermission("packaName", newUri, Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType(uri, "image/*");
startActivityForResult(intent, REQUEST_CROP);
}
编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/12689/
部分内容来自网络投稿,如有侵权联系立删