gpt4 book ai didi

android - 使用 ACTION_GET_CONTENT 或 OPEN_DOCUMENT 从 Google 相册提供商处挑选

转载 作者:IT老高 更新时间:2023-10-28 13:40:37 28 4
gpt4 key购买 nike

我不知道为什么会发生这种情况,但我无法从 Google 照片提供商处挑选图片。在 API 27 上进行测试。

使用 ACTION_GET_CONTENT

如果我使用:

val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
  • 我可以在提供商中看到 Google 相册
  • 我可以浏览到一些图片并选择它
  • 然后我被引导回提供者列表(而不是我的应用),就好像提供者在 try-catch 中崩溃了

当我打开照片提供程序并浏览文件夹时,我会看到很多这样的:

2019-03-02 12:04:15.164 17641-13395/? W/NetworkManagementSocketTagger: untagSocket(120) failed with errno -22
2019-03-02 12:04:22.528 13217-13217/? E/ResourceType: Style contains key with bad entry: 0x01010586
2019-03-02 12:04:22.535 13217-13217/? W/ResourceType: For resource 0x7f020366, entry index(870) is beyond type entryCount(468)

当我点击图片时,我看到了这些:

2019-03-02 12:04:34.150 13217-13217/? W/ResourceType: For resource 0x7f02036c, entry index(876) is beyond type entryCount(468)
2019-03-02 12:04:34.151 13217-13217/? W/ResourceType: For resource 0x7f02036c, entry index(876) is beyond type entryCount(468)
2019-03-02 12:04:34.229 2907-16891/? W/MediaExtractor: FAILED to autodetect media content.
2019-03-02 12:04:34.569 10839-10839/? W/ResourceType: ResTable_typeSpec entry count inconsistent: given 468, previously 1330

使用 ACTION_OPEN_DOCUMENT

在这种情况下,我什至在提供程序抽屉中都看不到 Google 相册。

问题

我该如何解决这个问题,最好使用 ACTION_GET_CONTENT?

最佳答案

编辑 2

我想我找到了问题的解决方案。 Google docs中提到了访问共享文件将为您提供 URI

The server app sends the file's content URI back to the client app in an Intent. This Intent is passed to the client app in its override of onActivityResult(). Once the client app has the file's content URI, it can access the file by getting its FileDescriptor.

下面是我在 onActivityResult 中使用的更新代码。确保最后调用onActivityResult的super方法。

super.onActivityResult(requestCode, resultCode, data)

工作代码

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
data?.data?.let {
util._log(TAG, it.toString())
}
if (data!!.data != null && data.data != null) {
try {

val stream = if (data.data!!.toString().contains("com.google.android.apps.photos.contentprovider")) {
val ff = contentResolver.openFileDescriptor(data.data!!, "r")
FileInputStream(ff?.fileDescriptor)
} else {
contentResolver.openInputStream(data.data!!)
}
val createFile = createImageFile()
util.copyInputStreamToFile(stream, createFile)
selectedImagePath = createFile.absolutePath

} catch (e: Exception) {
util._log(TAG, Log.getStackTraceString(e))
}
}
super.onActivityResult(requestCode, resultCode, data)
}

编辑

也可以查看 stackoverflow post

原创

我在我的 Redmi 6 pro 手机上的 Android oreo 8.1.0(API 27) 上使用它,它运行良好。

你还没有发布 onActivityResult 方法可能是你需要做一些修改的地方。我都试过了

下面是我的代码 fragment

val pickIntent = Intent(Intent.ACTION_VIEW)
pickIntent.type = "image/*"
pickIntent.action = Intent.ACTION_GET_CONTENT
pickIntent.addCategory(Intent.CATEGORY_OPENABLE)

startActivityForResult(pickIntent, SELECT_PICTURE)

onActivityResult 中我正在这样解析它

if (data!!.data != null && data.data != null) {
try {
// CommonUtilities._Log(TAG, "Data Type " + data.getType());
if (!isFinishing) {
val inputStream = contentResolver.openInputStream(data.data!!)
val createFile = createImageFile()
copyInputStreamToFile(inputStream!!, createFile)
// CommonUtilities._Log(TAG, "File Path " + createFile.getAbsolutePath());
selectedImagePath = createFile.absolutePath
}
} catch (e: IOException) {
util._log(TAG, Log.getStackTraceString(e))
}
}

新建文件的方法

@Throws(IOException::class)
private fun createImageFile(): File {
// Create an image file name
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(Date())
val imageFileName = "yesqueen_" + timeStamp + "_"
val storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
return File.createTempFile(imageFileName, ".jpg", storageDir)
}

从输入流中读取的方法

fun copyInputStreamToFile(`in`: InputStream, file: File) {
var out: OutputStream? = null
try {
out = FileOutputStream(file)
val buf = ByteArray(1024)
var len: Int = 0
while (`in`.read(buf).apply { len = this } > 0) {
out.write(buf, 0, len)
}

/*while (`in`.read(buf).let {
len = it
true
}) {
out.write(buf, 0, len)
}*/
/* while ((len = `in`.read(buf)) > 0) {
out.write(buf, 0, len)
}*/
} catch (e: Exception) {
e.printStackTrace()
} finally {
try {
out?.close()
} catch (e: Exception) {
e.printStackTrace()
}

try {
`in`.close()
} catch (e: Exception) {
e.printStackTrace()
}

}
}

关于android - 使用 ACTION_GET_CONTENT 或 OPEN_DOCUMENT 从 Google 相册提供商处挑选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54957859/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com