使用 AccessibilityService 检测屏幕任何区域的长按

问题描述 投票:0回答:1

我正在尝试使用 Accessiblity Service 检测屏幕任何区域的长按,我已经设置了代码,但它不起作用..任何帮助将不胜感激

** 无障碍服务


class RecentAppsAccessibilityService : AccessibilityService() {
    private var touchStartTime: Long = 0
    private val longPressThreshold = 500
    private val lockedApps = mutableSetOf<String>()

    private lateinit var database: DatabaseReference
    private val appPinCodes = mutableMapOf<String, String>()

    companion object {
        private const val TAG = "RecentAppsService"
    }

    override fun onCreate() {
        super.onCreate()
        database = FirebaseDatabase.getInstance().reference
        fetchLockedPackages()
    }


    private fun fetchLockedPackages() {
        database.child("childApp").addValueEventListener(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                appPinCodes.clear() // Clear previous data

                for (childSnapshot in dataSnapshot.children) {
                    val packageName = childSnapshot.child("package_name").getValue(String::class.java) ?: ""
                    val pinCode = childSnapshot.child("pin_code").getValue(String::class.java) ?: ""

                    if (packageName.isNotEmpty() && pinCode.isNotEmpty()) {
                        appPinCodes[packageName] = pinCode
                        lockedApps.add(packageName)
                    }
                }
                Log.d(TAG, "Updated locked apps: $lockedApps")
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.e("FirebaseError", "Error fetching data: ${databaseError.message}")
            }
        })
    }


    override fun onAccessibilityEvent(event: AccessibilityEvent) {
        Log.d(TAG, "Event received: ${event.eventType}")
        when (event.eventType) {
            AccessibilityEvent.TYPE_TOUCH_INTERACTION_START -> {
                touchStartTime = System.currentTimeMillis()
            }
            AccessibilityEvent.TYPE_TOUCH_INTERACTION_END -> {
                val touchDuration = System.currentTimeMillis() - touchStartTime
                if (touchDuration >= longPressThreshold) {
                    Log.d(TAG, "Long Press Detected")
                   // showPartialOverlay()
                }
            }
        }
    }
    

}

// 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools">

   <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
   <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
   <uses-permission android:name="android.permission.SET_COMPONENT_ENABLED_STATE" />
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
   <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
   <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
   <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
   <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
   <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"
       tools:ignore="ProtectedPermissions" />

   <application
       android:allowBackup="true"
       android:dataExtractionRules="@xml/data_extraction_rules"
       android:fullBackupContent="@xml/backup_rules"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/Theme.LockCompose"
       tools:targetApi="31">

       <service android:name=".FirebaseListenerService"
           android:enabled="true"
           android:exported="false"
           android:foregroundServiceType="specialUse"/>

       <activity
           android:name=".MainActivity"
           android:exported="true"
           android:label="@string/app_name"
           android:theme="@style/Theme.LockCompose">

           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>

       </activity>

       <service
           android:name=".x.RecentAppsAccessibilityService"
           android:exported="true"
           android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
           <intent-filter>
               <action android:name="android.accessibilityservice.AccessibilityService" />
           </intent-filter>

           <meta-data
               android:name="android.accessibilityservice"
               android:resource="@xml/accessibility_service_config" />
       </service>

</application>
   
</manifest>

// 服务配置


<accessibility-service android:accessibilityEventTypes="typeAllMask"
   android:accessibilityFeedbackType="feedbackSpoken"
   android:accessibilityFlags="flagDefault"
   android:canRequestFilterKeyEvents="true"
   android:notificationTimeout="100"
   android:packageNames="com.app.lockcomposeChild"
   android:canRetrieveWindowContent="true"
   xmlns:android="http://schemas.android.com/apk/res/android" />

android kotlin accessibilityservice
1个回答
0
投票

您可以使用以下代码检测长按

override fun onAccessibilityEvent(event: AccessibilityEvent?) {
    if (event?.eventType == AccessibilityEvent.TYPE_VIEW_LONG_CLICK) {
        // LongPress Detected here
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.