【问题标题】:Unable to pick image from Google Photos app无法从 Google 相册应用中选择图片
【发布时间】:2018-07-13 17:23:57
【问题描述】:

我正在使用以下代码(在 Kotlin 中)从我的三星平板电脑上的 Google 照片应用中选择一张图片。

val intent =  Intent (Intent.ACTION_GET_CONTENT)
intent.type = "image/*"
startActivityForResult(intent, REQUEST_GOOGLE_PHOTOS_IMAGE)

我也试过了

Intent (Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)

在运行此代码时,我会得到一个幻灯片,让我可以选择照片应用程序,然后我可以从中选择一张照片。但是,一旦我选择了照片,应用程序就不会像使用相机和图库那样将图像返回到我的应用程序。相反,它返回到滑出。当我点击后退按钮关闭滑出时,使用 RESULT_CANCELED 和 0 数据调用 onActivityResult。

我能够毫无问题地从图库和相机中检索照片,所以我不确定我错过了什么。也许是清单中的许可或其他内容?提前致谢!

【问题讨论】:

  • 查看我的答案here,以防您从具有singleInstance 启动模式的活动开始您的意图。这解决了您描述的相同问题。

标签: android android-intent kotlin google-photos


【解决方案1】:

让我们这样尝试,

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        } else {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
        }

【讨论】:

  • ACTION_OPEN_DOCUMENT 不起作用。在这种情况下,应用程序会完全跳过滑出(因此无法选择照片或任何其他应用程序)并直接进入画廊照片屏幕。
【解决方案2】:

问题是我没有连接到网络,因此 Google 相册无法检索所选图像。请参阅我对@adityakamble49 的回复。

【讨论】:

    【解决方案3】:

    使用 ACTION_GET_CONTENT 意图操作 - Intent.ACTION_GET_CONTENT

    调用下面的selectImage()方法开始pick image Intent,这将显示所有可以从中选择图像的应用程序

    private val RC_SELECT_IMGAE = 101
    
    private fun selectImage() {
        val selectImageIntent = Intent(Intent.ACTION_GET_CONTENT, MediaStore.Images.Media
                .EXTERNAL_CONTENT_URI)
        startActivityForResult(selectImageIntent, RC_SELECT_IMGAE)
    }
    

    然后通过在Activity中重写onActivityResult()方法来处理回调

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        when (requestCode) {
            RC_SELECT_IMGAE -> {
                if (data != null) {
                    val uri = data.data
                    displaySelectedImage(getBitmapFromUri(uri))
                }
            }
            else -> super.onActivityResult(requestCode, resultCode, data)
        }
    }
    

    最后用位图更新图像视图,如下所示

    private fun getBitmapFromUri(uri: Uri): Bitmap {
        val parcelFileDescriptor = contentResolver.openFileDescriptor(uri, "r")
        val fileDescriptor = parcelFileDescriptor?.fileDescriptor
        val image = BitmapFactory.decodeFileDescriptor(fileDescriptor)
        parcelFileDescriptor.close()
        return image
    }
    
    private fun displaySelectedImage(imageBitmap: Bitmap) {
        iv_selected_image.setImageBitmap(imageBitmap)
    }
    

    在此处查找工作图像选择器示例 - ImagePickerExample

    您可能需要添加 FileProvider 以防它给出任何类型的 URI 异常

    【讨论】:

    • ACTION_PICK 不起作用。它只允许我从图库中选择,而不是谷歌照片应用程序。这是我在 SO 上发布之前在搜索过程中尝试过的众多解决方案之一。
    • 我应该提到,如果我在 ACTION_PICK 请求中包含 intent.type = "image/*",我可以从谷歌照片中选择一张照片,但它会将 RESULT_CANCELED 返回到 onActivityResult 而不是图像。跨度>
    • @jilbot 它使用与上述相同的代码在我这边工作。我已经快速创建了用于挑选图像的示例应用程序。在这里结帐 - github.com/adityakamble49/image-picker-example
    • 感谢您抽出宝贵时间提供!同时我发现问题是我的设备没有连接到网络。我打开了 WiFi,现在可以得到一张必须从云端下载的照片。我错误地认为我的谷歌照片会存储在设备上,但似乎它们只在云端。所以我必须了解更多关于照片应用程序的信息,包括它是否以及何时将我的照片存储在设备上。无论如何,ACTION_PICK 和 ACTION_GET_CONTENT 现在都可以正常工作了。
    • @jilbot 很高兴为您提供帮助。您当然可以投票并批准感谢的答案。 :) 我已经使用 ACTION_GET_CONTENT 操作更新了帖子和示例。现在它可以处理离线和在线文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2011-05-10
    相关资源
    最近更新 更多