繁体   English   中英

将图像保存在 android 的画廊中

[英]Save image in gallery in android

问:更新compile-SDK时如何将图片URL传递给intent? 当我将 compile-SDK 更新到版本 30 时。此消息出现在 Android Studio 中。 应用程序崩溃。 但是当我将其降级到较低版本时,例如 29,应用程序运行良好。

我尝试了很多来解决它,但不幸的是,它没有工作......你能帮帮我吗?

FilterCollageActivity
    override fun onClick(v: View?) {
        when (v!!.id) {
            R.id.img_save -> {
                checkClick()
                isFromSaved = true
                try {
                    saveBitmap(screenShot)
                } catch (th: Throwable) {
                    th.printStackTrace()
                }
                val intent = Intent(this, ShowImageActivity::class.java)
                intent.putExtra("image_uri", savedImageUri!!.toString())
                startActivityForResult(intent, 2)
                finish()
            }
        }
    }

ShowImageActivity

    class ShowImageActivity : AppCompatActivity(), View.OnClickListener {
    
        private var image_uri: String? = null
        private var img_show: ImageView? = null
        private var saved_file: File? = null
        private var density: Float = 0.toFloat()
        internal var D_height: Int = 0
        internal var D_width: Int = 0
        private var display: DisplayMetrics? = null
    
        private var mLastClickTime: Long = 0
        fun checkClick() {
            if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
                return
            }
            mLastClickTime = SystemClock.elapsedRealtime()
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            requestWindowFeature(Window.FEATURE_NO_TITLE)
            window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
            setContentView(R.layout.activity_show_image)
    
            image_uri = intent.getStringExtra("image_uri")
            saved_file = File(image_uri!!)
            img_show = findViewById<View>(R.id.img_show) as ImageView
    
            display = resources.displayMetrics
            density = resources.displayMetrics.density
            D_width = display!!.widthPixels
            D_height = (display!!.heightPixels.toFloat() - density * 150.0f).toInt()
    
            val layoutParams = RelativeLayout.LayoutParams(D_width, ViewGroup.LayoutParams.WRAP_CONTENT)
            layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE)
            img_show!!.layoutParams = layoutParams
    
            img_show!!.setImageURI(Uri.parse(image_uri))
    
    ...
    
    
        }

2022-06-13 15:47:38.495 20691-20691/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.cocnanvd.nvdframe, PID: 20691
    java.lang.NullPointerException
        at com.cocnanvd.nvdframe.FilterCollageActivity.onClick(FilterCollageActivity.kt:53)
        at android.view.View.performClick(View.java:8160)
        at android.view.View.performClickInternal(View.java:8137)
        at android.view.View.access$3700(View.java:888)
        at android.view.View$PerformClick.run(View.java:30236)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8653)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

在 api 级别 30 之后,也许你的 saveBitmap() 方法不起作用所以 hare intent.putExtra("image_uri", savedImageUri!!.toString()) 你得到一个空指针异常。 可能是其他原因以及写权限等。 请添加完整的 FilterCollageActivity 代码

这是解决方案。

步骤1

private fun checkPermissionAndProceed() {
        val permission: Collection<String> =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) arrayListOf(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.ACCESS_MEDIA_LOCATION
            ) else arrayListOf(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            )

        Dexter.withContext(this@SolutionActivity)
            .withPermissions(permission)
            .withListener(object : MultiplePermissionsListener {
                override fun onPermissionsChecked(multiplePermissionsReport: MultiplePermissionsReport) {
                    if (multiplePermissionsReport.areAllPermissionsGranted()) {
                        addImageToGallery(
                            "IMG_" + System.currentTimeMillis() + ".JPEG",
                            bitMap!!, this@SolutionActivity
                        )
                    }

                    if (multiplePermissionsReport.isAnyPermissionPermanentlyDenied) {
                        //showSettingsDialog()
                        //Tell user why you need this permission.
                    }
                }

                override fun onPermissionRationaleShouldBeShown(
                    list: List<PermissionRequest>,
                    permissionToken: PermissionToken
                ) {
                    permissionToken.continuePermissionRequest()
                }
            }).onSameThread().check()
    }

第2步

private fun addImageToGallery(fileName: String, bitmap: Bitmap, ctx: Context) {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

                val fos: OutputStream
                val resolver = contentResolver
                val values = ContentValues()

                values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
                values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
                values.put(
                    MediaStore.MediaColumns.RELATIVE_PATH,
                    Environment.DIRECTORY_PICTURES + File.separator + "MyImages"
                )

                val imageUri = resolver.insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
                )
                fos = resolver.openOutputStream(imageUri!!) as OutputStream
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
                fos.close()
                Toast.makeText(ctx, getString(R.string.saved_in_gallery), Toast.LENGTH_SHORT).show()

            } else {
                val values = ContentValues()
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
                values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, fileName)
                values.put(MediaStore.Images.ImageColumns.TITLE, fileName)

                val uri: Uri? = ctx.contentResolver.insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
                )
                uri?.let {
                    ctx.contentResolver.openOutputStream(uri)?.let { stream ->
                        val oStream = BufferedOutputStream(stream)
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, oStream)
                        oStream.close()
                        Toast.makeText(
                            ctx, getString(R.string.saved_in_gallery), Toast.LENGTH_SHORT
                        ).show()
                    }
                }
            }
        } catch (e: Exception) {
            Toast.makeText(ctx, e.localizedMessage, Toast.LENGTH_SHORT).show()
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM