从URI获取图像路径时出现空指针异常错误

时间:2019-01-08 12:02:22

标签: android bitmap imageview uri

我使用以下代码打开图像选择器:

answer-div

然后我使用标准代码从val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } startActivityForResult(intent, REQUEST_IMAGE_PICK) 获取图像,如下所示(在 onActivity 结果中):

URI

获取路径功能如下:

val uri:Uri = data.data
            val imageP = getPath(context!!,uri)
//              Glide.with(this)
//                      .load(data.data)
//                      .apply(GlobalSiteRecords.options)
//                      .into(companyImageView)
//              return
            **imagePath = Uri.parse(imageP).toString()// NULL POINTER EXCEPTION HERE**
// following function loads the image and saves the path
                loadImageAndStoreImagePath(imagePath)
            } catch(e:Exception){
                e.printStackTrace()
                val a = Toast.makeText(activity,"Error reading file, please try a different file!",Toast.LENGTH_SHORT)
                a.setGravity(Gravity.FILL_HORIZONTAL,0,0)
                a.show()
            }

我不确定这是什么问题。我尝试在处理图像路径之前直接使用 fun getPath(context: Context, uri: Uri): String? { val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { val docId = DocumentsContract.getDocumentId(uri) val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() val type = split[0] if ("primary".equals(type, ignoreCase = true)) { return Environment.getExternalStorageDirectory().toString() + File.separator + split[1] } // TODO handle non-primary volumes } else if (isDownloadsDocument(uri)) { val id:String = DocumentsContract.getDocumentId(uri) val contentUri:Uri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)) return getDataColumn(context, contentUri, null, null) } else if (isMediaDocument(uri)) { val docId:String = DocumentsContract.getDocumentId(uri) val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() val type = split[0] var contentUri: Uri? = null if ("image" == type) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI } else if ("video" == type) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI } else if ("audio" == type) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI } val selection = "_id=?" val selectionArgs = arrayOf(split[1]) return getDataColumn(context, contentUri, selection, selectionArgs) }// MediaProvider // DownloadsProvider } else if ("content".equals(uri.getScheme(), ignoreCase = true)) { // Return the remote address return if (isGooglePhotosUri(uri)) uri.getLastPathSegment() else getDataColumn(context, uri, null, null) } else if ("file".equals(uri.getScheme(), ignoreCase = true)) { return uri.getPath() }// File // MediaStore (and general) return null } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ fun getDataColumn(context: Context, uri: Uri?, selection: String?, selectionArgs: Array<String>?): String? { var cursor: Cursor? = null val column = "_data" val projection = arrayOf(column) try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null) if (cursor != null && cursor.moveToFirst()) { val index = cursor.getColumnIndexOrThrow(column) return cursor.getString(index) } } finally { if (cursor != null) cursor.close() } return null } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ fun isExternalStorageDocument(uri: Uri): Boolean { return "com.android.externalstorage.documents".equals(uri.getAuthority()) } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ fun isDownloadsDocument(uri: Uri): Boolean { return "com.android.providers.downloads.documents".equals(uri.getAuthority()) } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ fun isMediaDocument(uri: Uri): Boolean { return "com.android.providers.media.documents".equals(uri.getAuthority()) } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ fun isGooglePhotosUri(uri: Uri): Boolean { return "com.google.android.apps.photos.content".equals(uri.getAuthority()) } } } URI加载图像,它可以正常工作,但是不幸的是,如果我没有图像路径,我将无法保存该图像的副本,这正是我想要做的。

0 个答案:

没有答案