活动没有重新开始

问题描述

我创建了一个应用,该应用使用firebase推送通知获取命令并执行该任务。 我的应用程序没有任何可见活动,但有一项在后台持续运行的服务。

我已经实现了使用Media Projection Api截屏的功能

当我获得截屏命令时,应用程序启动ScreenProjectionActivity,截屏并完成。但是当它再次出现时,Screenshot ScreenProjectionActivity的命令不会再次启动。我不知道我做错了什么,在哪里做错了。

这是我从服务中启动的方式。

context.startActivity(
                        Intent(this,ScreenProjectionActivity::class.java)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                    )

ScreenProjectionActivity.kt

class ScreenProjectionActivity : Activity()
{
    lateinit var context: Context
    private var mHandler: Handler? = null

    @RequiresApi(Build.VERSION_CODES.KITKAT_WATCH)
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        val tv = TextView(this)
        tv.text = ""
        setContentView(tv)
        context = this

        log("onCreate")

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        {
            val mgr = getSystemService(MEDIA_PROJECTION_SERVICE) as mediaprojectionmanager
            startActivityForResult(mgr.createScreenCaptureIntent(),7575)

            // start capture handling thread
            object : Thread() {
                override fun run() {
                    Looper.prepare()
                    mHandler = Handler()
                    Looper.loop()
                }
            }.start()
        }
    }

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
        super.onActivityResult(requestCode,resultCode,data)

        if (requestCode == 7575 && resultCode == RESULT_OK)
        {
            log("if taking screen")
            //TakeScreenShot(applicationContext,Handler(Looper.getMainLooper()),data).start()
            takeScreenShot(resultCode,data)
        }

        super.onBackpressed()
    }

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    private fun takeScreenShot(resultCode: Int,data: Intent?)
    {
        log("takeScreenshot")
        SystemClock.sleep(1000)
        var flagScreenShot = true

        val metrics = displayMetrics()
        val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val mgr = getSystemService(MEDIA_PROJECTION_SERVICE) as mediaprojectionmanager

        windowManager.defaultdisplay.getMetrics(metrics)

        val mMediaProjection = mgr.getMediaProjection(resultCode,data!!)

        val imgReader: ImageReader = ImageReader.newInstance(
            metrics.widthPixels,metrics.heightPixels,PixelFormat.RGBA_8888,1
        )

        val onImageAvailableListener =
            OnImageAvailableListener {
                log("onImageAvailableListener")
                val image: Image? = it?.acquireLatestimage()

                if (image != null && flagScreenShot)
                {
                    flagScreenShot = false
                    mMediaProjection?.stop()
                    log("mMediaProjection Stopped!")
                    imgReader.setonImageAvailableListener(null,null)

                    val mWidth = image.width
                    val mHeight = image.height

                    val planes = image.planes
                    val buffer = planes[0].buffer
                    val pixelStride = planes[0].pixelStride
                    val rowStride = planes[0].rowStride
                    val rowPadding = rowStride - pixelStride * mWidth

                    val bitmap = Bitmap.createBitmap(
                        mWidth + rowPadding / pixelStride,mHeight,Bitmap.Config.ARGB_8888
                    )
                    bitmap.copyPixelsFromBuffer(buffer)
                    saveImage(bitmap)
                }
                log("image close")
                image?.close()
            }

        mMediaProjection?.createVirtualdisplay(
            "ScreenCapture",metrics.widthPixels,metrics.densityDpi,displayManager.VIRTUAL_disPLAY_FLAG_AUTO_MIRROR,imgReader.surface,null,mHandler
        )

        imgReader.setonImageAvailableListener(onImageAvailableListener,mHandler)
    }

    private fun saveImage(finalBitmap: Bitmap) {
        val root: String = Environment.getExternalStorageDirectory().toString()
        val myDir = File("$root/saved_images")
        myDir.mkdirs()
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss",Locale.ENGLISH).format(Date())
        val fname = "Shutta_$timeStamp.jpg"
        val file = File(myDir,fname)
        if (file.exists()) file.delete()
        try
        {
            val out = FileOutputStream(file)
            finalBitmap.compress(Bitmap.CompressFormat.JPEG,100,out)
            out.flush()
            out.close()

            log("Image Saved.")
            finish()

        } catch (e: Exception) {
            log("Image Saved Exception: $e")
        }
    }


    private fun encodeImage(bm: Bitmap): String {
        val baos = ByteArrayOutputStream()
        bm.compress(Bitmap.CompressFormat.JPEG,baos)
        val b = baos.toByteArray()
        return Base64.encodetoString(b,Base64.DEFAULT)
    }

    override fun onDestroy() {
        super.onDestroy()
    }

}

在这里帮助我。谢谢

解决方法

我自己解决了这个问题,我所做的就是使用这些标志的startActivity

applicationContext.startActivity(
                    Intent(this,ScreenProjectionActivity::class.java)
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                )

并在清单中:

<activity
        android:name=".ScreenProjectionActivity"
        android:excludeFromRecents="true"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...