使用ACTION_GET_CONTENT获取图像返回了空URI。

4
我有一个已发布的应用程序,使用 ACTION_GET_CONTENT 意图让用户选择自己的图片之一。以下是启动意图的代码:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
intent.putExtra(Intent.CATEGORY_OPENABLE, true);
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_pic)), SELECT_IMAGE);

以下是onActivityResult的代码:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(resultCode == RESULT_OK) {
        if (requestCode == SELECT_IMAGE) {
            if (data != null) {
                Uri uri = data.getData();
                ...
                }
            }
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}

问题在于,在某些设备上,即使用户选择了图片,uri仍然为空。主要是三星设备和一些摩托罗拉手机。我还尝试过使用ACTION_PICK而不是ACTION_CONTENT,但在其他一些设备上也发生了这种情况。因此,我想知道是否有一种通用的方式让用户选择图片。
一些遇到此问题的手机包括:
  • 三星Galaxy A21S - Android 11(SDK 30)
  • 三星Galaxy A3(2016) - Android 7.0(SDK 24)
  • 摩托罗拉moto e6 play - Android 9(SDK 28)
其中一些受影响设备的用户报告说它只会偶尔发生。

你也必须尝试使用 ACTION_OPEN_DOCUMENT - blackapps
1
我已经添加了。关于ACTION_OPEN_DOCUMENT,我不太喜欢它,因为选择器界面的选项较少。不管怎样,你有选择ACTION_OPEN_DOCUMENT的任何理由吗? - Josemafuen
希望这个链接能对你有所帮助。 - Zain
3个回答

1
对我来说,活动的launchMode设置为singleInstance,因此当从图库选择图像时,返回的图像URI为空。更改它可以解决问题。

0

尝试这个解决方案

val getImage = registerForActivityResult(ActivityResultContracts.GetContent()) {
        if (it != null) {
            binding.image.setImageURI(it)
        }
    }
    binding.image.setOnClickListener {
        getImage.launch("image/*")
    }

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

-1

OnActivityResult已被弃用

尝试使用新的方法

ActivityResultLauncher<String> launcher;

.....

Button pick = findViewById(R.id.pick);
pick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                launcher.launch("image/*");
            }
        });

launcher = registerForActivityResult(new ActivityResultContracts.GetContent(), new ActivityResultCallback<Uri>() {
        @Override
        public void onActivityResult(Uri result) {
            
        }
    });

}

请提供相关文件证明这一点。不管怎样,我会进行测试。 - Josemafuen
@JOSEMAFUEN 请查看https://developer.android.com/training/basics/intents/result#java 或 https://dev59.com/aVIG5IYBdhLWcg3w2VQZ - droid24
谢谢,这是一个很好的观点,我肯定会测试一下。不过,你有没有关于这种方法是否适用于所有设备的提示呢?还是只是“试试这种方式看看是否会变得更好”? - Josemafuen
@JOSEMAFUEN 我之前在几台设备上尝试过,一切正常运作。此外,谷歌在文档中也提到,活动可能因为低内存或其他原因而被销毁,因此返回一个空值。https://developer.android.com/training/basics/intents/result#register - droid24
1
很遗憾,这个解决方案没有成功。当应用程序打开文件浏览器供我选择时,如果我选择了一张“最近”的图片,它可以正常工作。但是,如果我从文件浏览器中打开我的相册并选择一张图片,返回的 URI 就是空的。 - Josemafuen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接