小米开发平台 双开应用修改头像失败等场景适配说明

在Android 11及以上版本,当应用双开后,双开应用中启动系统剪裁页面,实现修改头像等场景时,会出现剪裁保存图片失败问题。此场景需要应用适配双开。

小米开发平台 双开应用修改头像失败等场景适配说明

背景

Android 11及以上版本,当应用双开后,双开应用中启动系统剪裁页面,实现修改头像等场景时,会出现剪裁保存图片失败问题。此场景需要应用适配双开。

应用双开功能

手机设置-应用设置-应用双开

适配说明

在应用启动剪裁页面时,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", 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/

部分内容来自网络投稿,如有侵权联系立删

(0)
上一篇 2022年11月24日 下午3:14
下一篇 2022年11月24日 下午3:18

相关推荐