davexa 2022-12-19 12:20 采纳率: 70%
浏览 29
已结题

安卓app,从相册选取照片做裁剪,Intent.ACTION_PICK,在API Level 31的AVD上跑,得到的uri疑似是错误的?

Hi, 大家好!

安卓app里,从相册选取照片做裁剪,Intent.ACTION_PICK,在API Level 31的AVD上跑,得到的uri疑似是错误的?

用Intent.ACTION_PICK 选取系统相册中一张图片,

        Intent i = new Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, REQUEST_GALLERY_IMAGE);

得到的uri如下:
mImageCaptureUri = content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F76/ORIGINAL/NONE/image%2Fjpeg/296819256

实际上,这个jpg文件在Downloads文件夹下。而且,我在Files里查看到,它的uri是:content://com.android.providers.downloads.documents/document/msf%3A74

问题1:怎么用Intent.ACTION_PICK 选取后就变样了呢?而且那个mImageCaptureUri ,貌似是多了个无用的前缀“content://com.google.android.apps.photos.contentprovider/-1/1/”!

问题2:可能就是这个奇怪的uri,导致接下来调用intent CROP裁剪时失败,这个uri给intent.SetData(uri)作为源文件。执行画面报错信息:读取文件失败。
AVD上画面提示:Error, could not load media

在启动CROP intent前,已经授权过了。如下。
grantUriPermission(packageName, mImageCaptureUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

问题3:更令我大跌眼镜的是,这个奇怪的uri及app,虽然在API Level 31的AVD上调用裁剪失败,而在API Level 33的AVD上跑,却能正常运行!

真不知道是Google的AVD某个版本有瑕疵呢,还是代码哪里有问题哦!

请大家指点迷津哦。谢谢!

  • 写回答

1条回答 默认 最新

  • davexa 2022-12-23 20:28
    关注

    针对问题3,补充一点。

    在API Level 31的AVD上调用裁剪失败,而在API Level 33的AVD上成功,
    两者的AVD除过API Level不同之外,前者是仅支持Google APIs的image,没有设置G账号;而后者则是支持Google Play的image,而且设置过并登入了Google账号的。
    不知到与这些环境的差别,有没有关系呢?

    评论

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 创建了问题 12月19日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号