From 7ac90632486d20c722104f1ac46d1efa95c083df Mon Sep 17 00:00:00 2001 From: Raymond Yang Date: Sat, 1 Jul 2023 11:17:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=BF=E6=8E=89=E5=85=B6=E4=BB=96=E6=87=B8?= =?UTF-8?q?=E6=B5=AE=E7=AA=97=E7=AF=84=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ray650128/floatwindowdemo/MainActivity.kt | 69 +------------------ .../service/WorkAccessibilityService.kt | 34 +++++++-- .../ray650128/floatwindowdemo/utils/Utils.kt | 19 +++-- app/src/main/res/layout/activity_main.xml | 23 ------- 4 files changed, 39 insertions(+), 106 deletions(-) diff --git a/app/src/main/java/com/ray650128/floatwindowdemo/MainActivity.kt b/app/src/main/java/com/ray650128/floatwindowdemo/MainActivity.kt index 96f26ca..511725a 100644 --- a/app/src/main/java/com/ray650128/floatwindowdemo/MainActivity.kt +++ b/app/src/main/java/com/ray650128/floatwindowdemo/MainActivity.kt @@ -26,7 +26,6 @@ import com.ray650128.floatwindowdemo.utils.ViewModelMain */ class MainActivity : AppCompatActivity(), View.OnClickListener { - private var floatRootView: View? = null//悬浮窗View private var isReceptionShow = false private lateinit var binding: ActivityMainBinding @@ -39,85 +38,20 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { startService(Intent(this, SuspendwindowService::class.java)) binding.apply { - bt01.setOnClickListener(this@MainActivity) - bt02.setOnClickListener(this@MainActivity) bt03.setOnClickListener(this@MainActivity) - bt04.setOnClickListener(this@MainActivity) - bt05.setOnClickListener(this@MainActivity) } } override fun onClick(v: View?) { when (v?.id) { - R.id.bt_01 -> { - showCurrentWindow() - } - R.id.bt_02 -> { - Utils.checkSuspendedWindowPermission(this) { - isReceptionShow = false - ViewModelMain.isShowSuspendWindow.postValue(true) - } - } R.id.bt_03 -> { Utils.checkAccessibilityPermission(this) { ViewModelMain.isShowWindow.postValue(true) } } - R.id.bt_04 -> { - Utils.checkSuspendedWindowPermission(this) { - isReceptionShow = true - ViewModelMain.isShowSuspendWindow.postValue(true) - } - } - R.id.bt_05 -> { - closeAllSuspendWindow() - } } } - /** - * 应用界面内显示悬浮球 - */ - @SuppressLint("ClickableViewAccessibility") - private fun showCurrentWindow() { - var layoutParam = WindowManager.LayoutParams().apply { - //设置大小 自适应 - width = WRAP_CONTENT - height = WRAP_CONTENT - flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - x = 10 - y = 10 - } - // 新建悬浮窗控件 - floatRootView = LayoutInflater.from(this).inflate(R.layout.activity_float_item, null) - floatRootView?.findViewById(R.id.iv_close)?.setOnClickListener { - windowManager?.removeView(floatRootView) - } - //设置拖动事件 - floatRootView?.setOnTouchListener(ItemViewTouchListener(layoutParam, windowManager)) - floatRootView?.focusable = View.FOCUSABLE - // 将悬浮窗控件添加到WindowManager - windowManager.addView(floatRootView, layoutParam) - } - - - /** - * 关闭所有悬浮窗 - */ - fun closeAllSuspendWindow() { - if (!Utils.isNull(floatRootView)) { - if (!Utils.isNull(floatRootView?.windowToken)) { - if (!Utils.isNull(windowManager)) { - windowManager?.removeView(floatRootView) - } - } - } - ViewModelMain.isShowSuspendWindow.postValue(false) - ViewModelMain.isShowWindow.postValue(false) - } - - - @RequiresApi(api = Build.VERSION_CODES.M) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == REQUEST_FLOAT_CODE) { if (Settings.canDrawOverlays(this)) { @@ -136,8 +70,8 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { } override fun onPause() { - super.onPause() binding.textView.text = "onPause" + super.onPause() } override fun onStop() { @@ -146,5 +80,4 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { ViewModelMain.isVisible.postValue(false) } } - } diff --git a/app/src/main/java/com/ray650128/floatwindowdemo/service/WorkAccessibilityService.kt b/app/src/main/java/com/ray650128/floatwindowdemo/service/WorkAccessibilityService.kt index f63f20b..c896686 100644 --- a/app/src/main/java/com/ray650128/floatwindowdemo/service/WorkAccessibilityService.kt +++ b/app/src/main/java/com/ray650128/floatwindowdemo/service/WorkAccessibilityService.kt @@ -5,9 +5,13 @@ import android.annotation.SuppressLint import android.content.Intent import android.graphics.PixelFormat import android.os.Build +import android.os.Handler +import android.os.Looper import android.util.DisplayMetrics import android.view.* import android.view.accessibility.AccessibilityEvent +import android.widget.ImageView +import android.widget.TextView import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry @@ -15,6 +19,7 @@ import com.ray650128.floatwindowdemo.R import com.ray650128.floatwindowdemo.utils.ItemViewTouchListener import com.ray650128.floatwindowdemo.utils.Utils.isNull import com.ray650128.floatwindowdemo.utils.ViewModelMain +import java.text.SimpleDateFormat /** * @功能:利用無障礙打開懸浮視窗 無侷限性 任何界面可以顯示 @@ -23,9 +28,23 @@ import com.ray650128.floatwindowdemo.utils.ViewModelMain * @Compony 永遠相信美好的事情即將發生 */ class WorkAccessibilityService : AccessibilityService(), LifecycleOwner { + private lateinit var windowManager: WindowManager private var floatRootView: View? = null//懸浮窗View private val mLifecycleRegistry = LifecycleRegistry(this) + + + private val timeUpdateHandler = Handler(Looper.getMainLooper()) + private val timeUpdateRunnable = object : Runnable { + @SuppressLint("SimpleDateFormat") + override fun run() { + val now = System.currentTimeMillis() + val simpleDateFormat = SimpleDateFormat("HH:mm:ss") + floatRootView?.findViewById(R.id.tv_time)?.text = simpleDateFormat.format(now) + timeUpdateHandler.postDelayed(this, 1000) + } + } + override fun onCreate() { super.onCreate() mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); @@ -44,6 +63,7 @@ class WorkAccessibilityService : AccessibilityService(), LifecycleOwner { if (!isNull(floatRootView?.windowToken)) { if (!isNull(windowManager)) { windowManager.removeView(floatRootView) + timeUpdateHandler.removeCallbacks(timeUpdateRunnable) } } } @@ -68,13 +88,18 @@ class WorkAccessibilityService : AccessibilityService(), LifecycleOwner { } flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE //flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - width = WindowManager.LayoutParams.WRAP_CONTENT - height = WindowManager.LayoutParams.WRAP_CONTENT + width = 260 + height = 60 format = PixelFormat.TRANSPARENT } floatRootView = LayoutInflater.from(this).inflate(R.layout.activity_float_item, null) + floatRootView?.findViewById(R.id.iv_close)?.setOnClickListener { + windowManager.removeView(floatRootView) + timeUpdateHandler.removeCallbacks(timeUpdateRunnable) + } floatRootView?.setOnTouchListener(ItemViewTouchListener(layoutParam, windowManager)) windowManager.addView(floatRootView, layoutParam) + timeUpdateHandler.post(timeUpdateRunnable) } @@ -84,9 +109,10 @@ class WorkAccessibilityService : AccessibilityService(), LifecycleOwner { } override fun getLifecycle(): Lifecycle = mLifecycleRegistry - override fun onStart(intent: Intent?, startId: Int) { - super.onStart(intent, startId) + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START) + return super.onStartCommand(intent, flags, startId) } override fun onUnbind(intent: Intent?): Boolean { diff --git a/app/src/main/java/com/ray650128/floatwindowdemo/utils/Utils.kt b/app/src/main/java/com/ray650128/floatwindowdemo/utils/Utils.kt index cfbe593..898cc9e 100644 --- a/app/src/main/java/com/ray650128/floatwindowdemo/utils/Utils.kt +++ b/app/src/main/java/com/ray650128/floatwindowdemo/utils/Utils.kt @@ -47,8 +47,7 @@ object Utils { return false } val myManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - val runningService = - myManager.getRunningServices(1000) as ArrayList + val runningService = myManager.getRunningServices(1000) as ArrayList for (i in runningService.indices) { if (runningService[i].service.className == ServiceName) { return true @@ -62,15 +61,13 @@ object Utils { */ private fun commonROMPermissionCheck(context: Context?): Boolean { var result = true - if (Build.VERSION.SDK_INT >= 23) { - try { - val clazz: Class<*> = Settings::class.java - val canDrawOverlays = - clazz.getDeclaredMethod("canDrawOverlays", Context::class.java) - result = canDrawOverlays.invoke(null, context) as Boolean - } catch (e: Exception) { - Log.e("ServiceUtils", Log.getStackTraceString(e)) - } + try { + val clazz: Class<*> = Settings::class.java + val canDrawOverlays = + clazz.getDeclaredMethod("canDrawOverlays", Context::class.java) + result = canDrawOverlays.invoke(null, context) as Boolean + } catch (e: Exception) { + Log.e("ServiceUtils", Log.getStackTraceString(e)) } return result } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a1556e9..6b401cc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -9,23 +9,6 @@ android:orientation="vertical" android:paddingTop="50dp" tools:context=".MainActivity"> -