问题描述
我创建了一个应用,该应用使用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" />