【问题标题】:select photo on gallery kotlin在画廊 kotlin 上选择照片
【发布时间】:2019-05-01 08:34:01
【问题描述】:

如何更改此代码以打开画廊并选择照片。我不需要相机功能。谢谢

我的应用程序中需要此功能,但我无法更改该部分代码。有人可以帮我调整一下。

我根据您指出的修改更新了帖子。

编辑

错误行

val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, this.imageUri) as Bitmap

传递结果失败 ResultInfo{who=android:fragment:2, 请求=1000,结果=-1,数据=意图{ dat=content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/48/ORIGINAL/NONE/207210023 flg=0x1 剪辑={文本/uri 列表 U:content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F48/ORIGINAL/NONE/207210023} }} 到活动 {maps.com/maps.com.MainActivity}: java.lang.NullPointerException: uri

private fun checkPermissionForImage() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if ((checkSelfPermission(this.context, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)
                    && (checkSelfPermission(this.context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)
            ) {
                val permission = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
                val permissionCoarse = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)

                requestPermissions(permission, PERMISSION_CODE_READ) // GIVE AN INTEGER VALUE FOR PERMISSION_CODE_READ LIKE 1001
                requestPermissions(permissionCoarse, PERMISSION_CODE_WRITE) // GIVE AN INTEGER VALUE FOR PERMISSION_CODE_WRITE LIKE 1002
            } else {
                pickImageFromGallery()
            }
        }
    }
    private fun pickImageFromGallery() {
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = "image/*"
        startActivityForResult(intent, IMAGE_PICK_CODE) // GIVE AN INTEGER VALUE FOR IMAGE_PICK_CODE LIKE 1000
    }

    /**
     * Save the picture to the thumbnail after taking it
     */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == IMAGE_PICK_CODE && resultCode == RESULT_OK) {
            try {
                //Getting the Bitmap from Gallery
                val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, this.imageUri) as Bitmap
                this.imgThumb!!.setImageBitmap(bitmap)
                this.pictureTaken = true
            } catch (e:IOException) {
                e.printStackTrace()
            }
        } else {
            Toast.makeText(context, "Error loading image", Toast.LENGTH_LONG)
        }
    }

    @Throws(IOException::class)
    fun createImageFile(): File {
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val imageFileName: String = "JPEG_" + timeStamp + "_"
        val storageDir: File = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        if(!storageDir.exists()) storageDir.mkdirs()
        val imageFile = File.createTempFile(imageFileName, ".jpg", storageDir)
        imageFilePath = imageFile.absolutePath
        return imageFile
    }

【问题讨论】:

    标签: java android kotlin


    【解决方案1】:

    首先你必须检查存储权限:

    private fun checkPermissionForImage() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if ((checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)
                && (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)
            ) {
                val permission = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
                val permissionCoarse = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
    
                requestPermissions(permission, PERMISSION_CODE_READ) // GIVE AN INTEGER VALUE FOR PERMISSION_CODE_READ LIKE 1001
                requestPermissions(permissionCoarse, PERMISSION_CODE_WRITE) // GIVE AN INTEGER VALUE FOR PERMISSION_CODE_WRITE LIKE 1002
            } else {
                pickImageFromGallery()
            }
        }
    }
    

    如您所见,如果授予权限,我正在访问一个名为pickImageFromGallery() 的方法。这是为了访问图库以选择图像:

    private fun pickImageFromGallery() {
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = "image/*"
        startActivityForResult(intent, IMAGE_PICK_CODE) // GIVE AN INTEGER VALUE FOR IMAGE_PICK_CODE LIKE 1000
    }
    

    现在,您必须重写 onActivityResult 方法。这将返回您选择的图像URI。

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK && requestCode == IMAGE_PICK_CODE) {
            // I'M GETTING THE URI OF THE IMAGE AS DATA AND SETTING IT TO THE IMAGEVIEW
            imageView.setImageURI(data?.data)
        }
    }
    

    【讨论】:

    • 谢谢,在选定的 img 上给出此错误,传递结果失败 ResultInfo{who=android:fragment:2, request=1000, result=-1, data=Intent { dat=content://com .google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/48/ORIGINAL/NONE/207210023 flg=0x1 clip={text/uri-list U:content: //com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F48/ORIGINAL/NONE/207210023} }} 到活动 {maps.com/ maps.com.MainActivity}: java.lang.NullPointerException: uri
    • 我用你指出的修改更新了帖子。
    • 确保您在清单文件中添加了这些权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,并在pickImageFromGallery() 和onActivityResult 方法中使用了相同的IMAGE_PICK_CODE(相同的整数值)。
    • 我也遇到了同样的问题,我对清单有权限我不明白为什么它不起作用。
    猜你喜欢
    • 2013-07-30
    • 2015-03-11
    • 1970-01-01
    • 2021-10-06
    • 2020-11-22
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多