0
  • 1
    /**调用相机*/
    private fun openCamera() {
        val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        //判断是否有相机
        if (captureIntent.resolveActivity(packageManager)!= null){
            photoUri = creatImageUri()
            mCameraUrl = photoUri
            if (photoUri != null){
                captureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri)
                captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                startActivityForResult(captureIntent,PERMISSION_CAMERA_REQUEST_CODE)
            }
        }
    }
    /**创建图片地址uri,用于保存拍照后的照片*/
    private fun creatImageUri(): Uri? {
        val status = Environment.getExternalStorageState()
        //判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机储存
        if (status.equals(Environment.MEDIA_MOUNTED)){
            return contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                ContentValues()
            )
        }else{
            return contentResolver.insert(
                MediaStore.Images.Media.INTERNAL_CONTENT_URI,
                ContentValues()
            )
        }
    }
    
    /**接收拍照结果和显示图片 从Uri获取图片 */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PERMISSION_CAMERA_REQUEST_CODE){
            if (resultCode == RESULT_OK){
                //iv_photo.setImageURI(mCameraUrl)
                bitmap = MediaStore.Images.Media.getBitmap(contentResolver,mCameraUrl)
                imageUriList.add(mCameraUrl!!)
                attachmentAdapter!!.notifyDataSetChanged()
            }
        }
        else if (requestCode == 200 && data != null){
            Thread(Runnable {
                runOnUiThread {
                    val imageNames = data.clipData
                    if (imageNames != null){
                        for (i in 0..imageNames.itemCount - 1){
                            val uri = imageNames.getItemAt(i).uri
                            imageUriList.add(uri)
                            attachmentAdapter!!.notifyDataSetChanged()
                        }
                    }else{
                        imageUriList.add(data.data!!)
                        attachmentAdapter!!.notifyDataSetChanged()
                    }
                }
            }).start()
        }
    }
    

    这是我用kotlin写的

    1248043264225841152  评论     打赏       JERRY·轩
    • 2

      调用相机本来就是一个兼容性的坑,系统的api,在不同版本,不同的手机,存在很大问题的

      建议使用第三方框架,因为处理了你用系统api可能遇到的问题。

      明白了吧。

      这,就是一个大坑!不要太理想的认为几行代码就能完成这个功能!

      实际开发过程中,当然使用兼容性最好的lib。因为lib已经可能发布到市面上面,经历过众多用户的体验,如果有问题会不断修复。然后组合成一个star很多的lib。

      你用lib。就找star很多的。但是,多也有问题。因为,这本身就是个大坑!!!!!!!!

      1139423796017500160  评论     打赏       断点-含光君
      • 1

        可以自己按照api调用系统相机:https://www.jianshu.com/p/8eef50c360e9

        也可以用知乎的Matisse框架:https://github.com/zhihu/Matisse

        这两种方式都能调用系统相机

        1231473582161268736  评论     打赏       感同身受
        相关问题
        念白 · android
        2020-01-20 18:22 271 2
        拉大锯程序员 · android / php
        2020-02-11 15:59 262 2
        2020-02-13 16:19 225 12
        beater817 · android网络API
        2020-02-24 15:32 136 2