Android Share Intent for a Bitmap - is it possible not to save it prior sharing?

前端 未结 5 713
遇见更好的自我
遇见更好的自我 2020-11-27 10:12

I try to export a bitmap from my app using share intent without saving a file for a temporal location. All the examples I found are two-step 1) save to SD Card and create U

5条回答
  •  甜味超标
    2020-11-27 10:48

    Here is working method to make a screenshot of own app and share it as image via any messanger or email client.

    To fix the bitmap not updating problem I improved Suragch's answer, using Gurupad Mamadapur's comment and added own modifications.


    Here is code in Kotlin language:

    private lateinit var myRootView:View // root view of activity
    @SuppressLint("SimpleDateFormat")
    private fun shareScreenshot() {
        // We need date and time to be added to image name to make it unique every time, otherwise bitmap will not update
        val sdf = SimpleDateFormat("yyyyMMdd_HHmmss")
        val currentDateandTime = sdf.format(Date())
        val imageName = "/image_$currentDateandTime.jpg"       
    
        // CREATE
        myRootView = window.decorView.rootView
        myRootView.isDrawingCacheEnabled = true
        myRootView.buildDrawingCache(true) // maybe You dont need this
        val bitmap = Bitmap.createBitmap(myRootView.drawingCache)
        myRootView.isDrawingCacheEnabled = false
    
        // SAVE
        try {
            File(this.cacheDir, "images").deleteRecursively() // delete old images
            val cachePath = File(this.cacheDir, "images")
            cachePath.mkdirs() // don't forget to make the directory
            val stream = FileOutputStream("$cachePath$imageName")
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream) // can be png and any quality level
            stream.close()
        } catch (ex: Exception) {
            Toast.makeText(this, ex.javaClass.canonicalName, Toast.LENGTH_LONG).show() // You can replace this with Log.e(...)
        }
    
        // SHARE
        val imagePath = File(this.cacheDir, "images")
        val newFile = File(imagePath, imageName)
        val contentUri = FileProvider.getUriForFile(this, "com.example.myapp.fileprovider", newFile)
        if (contentUri != null) {
            val shareIntent = Intent()
            shareIntent.action = Intent.ACTION_SEND
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // temp permission for receiving app to read this file
            shareIntent.type = "image/jpeg" // just assign type. we don't need to set data, otherwise intent will not work properly
            shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri)
            startActivity(Intent.createChooser(shareIntent, "Choose app"))
        } 
    }
    

提交回复
热议问题