【问题标题】:Why is contentResolver.query() returning null?为什么 contentResolver.query() 返回 null?
【发布时间】:2019-07-28 04:33:10
【问题描述】:

我正在将 AWS S3TransferUtilitySample 从 Java 重构为 Kotlin,并在尝试上传图像时遇到异常。在图库意图使用图像 URI 返回我的应用程序之后,我将错误追踪到。在onActivityResultgetContentResolver.query(...) 内是问题所在。

  • Java cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null); 在我的代码中转换为
  • Kotlin cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)

此时的query 参数值为:

  • uricontent://media/external/images/media
  • projection{"_data"}
  • selection"_id=?"
  • selectionArgs{"3812"}
  • sortOrdernull

我查阅了contentResolver 的文档,我认为我可能错误地解压了查询参数。我看到了this answer,但没有任何帮助。有什么建议吗?

【问题讨论】:

  • 我认为在您的图像媒体中没有 id 3812 的图像,如果您检查所有媒体已返回以删除 projectonselectionselectionArgs 在查询中仅触发带有 @ 的查询987654345@;并检查结果
  • 谢谢@AshishPatidar。我认为3812 是从所选图像的路径中正确解析的。我不确定我是否理解你的第二个建议。 query(...) 方法必须采用这些参数中的每一个,所以我不能只用uri 来触发它。如果我有误解,请告诉我。
  • Cursor c1 = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 这是我为联系人运行的示例,仅用于 URI 其他参数为空。

标签: android kotlin aws-amplify


【解决方案1】:

这是一个权限错误。在Logcat中,我看到了

2019-07-30 09:32:57.566 11640-12481/? E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=13823, uid=10149 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:633)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:503)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:214)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:102)
        at android.os.Binder.execTransact(Binder.java:697)

然后我看到我事先注释掉了权限代码,以便更好地了解发生了什么。任务完成了。实际上,我只是删除了注释代码并从头开始编写它以将课程带回家。

这是修复它的原因:

  • AndroidManifest.xml添加权限

<uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE”/>

  • 在用户按下上传图片按钮时检查并授予应用权限
    buttonUploadImage!!.setOnClickListener {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    val permissions = arrayOf(permission.READ_EXTERNAL_STORAGE)

                    val intent = Intent()
                    intent.action = Intent.ACTION_GET_CONTENT
                    intent.type = "image/*"

                    if (checkSelfPermission(permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                                permission.READ_EXTERNAL_STORAGE)) {
                            // Explain why the permission is needed
                        } else {
                            ActivityCompat.requestPermissions(this, permissions, PERMISSION_CODE)
                        }
                    } else {
                        // Permission has already been granted
                        startActivityForResult(intent, PERMISSION_CODE)
                    }
                }
            }

资源

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 2022-12-26
    • 2016-12-28
    • 2015-11-25
    • 2015-07-04
    • 2019-09-29
    • 2015-02-25
    • 2015-10-21
    • 2021-08-12
    相关资源
    最近更新 更多