簡體   English   中英

為什么contentResolver.query()返回null?

[英]Why is contentResolver.query() returning null?

我將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的文檔,我認為我可能錯誤地解開了查詢參數。 我看到了這個答案 ,但沒有任何幫助。 有什么建議么?

這是一個權限錯誤。 在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)
                    }
                }
            }

資源資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM