我使用以下代码打开图像选择器:
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
加载图像,它可以正常工作,但是不幸的是,如果我没有图像路径,我将无法保存该图像的副本,这正是我想要做的。