获取图像的 ACTION_GET_CONTENT 返回空 URI

Posted

技术标签:

【中文标题】获取图像的 ACTION_GET_CONTENT 返回空 URI【英文标题】:ACTION_GET_CONTENT to get image returns null URI 【发布时间】:2022-01-01 04:42:31 【问题描述】:

我有一个已发布的应用程序,它使用 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) Motorola moto e6 play - Android 9 (SDK 28)

这些受影响设备的一些用户通知说它只是偶尔发生。

【问题讨论】:

你也得试试ACTION_OPEN_DOCUMENT 我已经添加了。关于ACTION_OPEN_DOCUMENT,我不是很喜欢,因为picker界面的选项比较少。无论如何,您有任何理由选择 ACTION_OPEN_DOCUMENT 吗? 希望this能帮到你 【参考方案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 检查developer.android.com/training/basics/intents/result#java 或***.com/questions/62671106/… 谢谢,这是一个很好的观点,我一定会测试它。无论如何,您对这种方式是否适用于所有设备有任何提示。还是只是“试试这个方法看看会不会好起来”? @JOSEMAFUEN 我过去曾在几台设备上尝试过它,它工作正常,谷歌也在文档中表示,该活动可能因多种原因而被破坏,包括内存不足或其他原因,因此它会返回具有空值developer.android.com/training/basics/intents/result#register 很遗憾,这个解决方案没有奏效。当应用程序打开文件资源管理器供我选择时,如果我选择一张“最近”图片,它就可以工作。但是,如果我从文件资源管理器中打开我的图库并选择一张图片,则返回的 uri 为空。【参考方案2】:

试试这个解决方案

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

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于获取图像的 ACTION_GET_CONTENT 返回空 URI的主要内容,如果未能解决你的问题,请参考以下文章

从图库中获取图像,但不会裁剪

使用 ACTION_GET_CONTENT 选择文件路径时获取文件路径的正确方法

Intent.ACTION_GET_CONTENT 和 Intent.ACTION_PICK 之间的区别

如何仅从 Google Photos 应用程序中选择图像? Android 谷歌照片意图

Intent.ACTION_GET_CONTENT用法

如何为 ACTION_GET_CONTENT 返回多个文件?