新增 auto.setFlags("useShell"),可以使用shell获取当前活动和当前包名,更加准确

This commit is contained in:
hyb1996
2018-12-17 23:06:46 +08:00
parent ff0b215115
commit 2312e610bf
8 changed files with 212 additions and 101 deletions

View File

@@ -1,87 +0,0 @@
package com.stardust.view.accessibility
import android.accessibilityservice.AccessibilityService
import android.app.AppOpsManager
import android.app.usage.UsageStatsManager
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.view.accessibility.AccessibilityEvent
import androidx.annotation.RequiresApi
import com.stardust.app.isOpPermissionGranted
/**
* Created by Stardust on 2017/3/9.
*/
class AccessibilityInfoProvider(private val context: Context) : AccessibilityDelegate {
private val mPackageManager: PackageManager = context.packageManager
@Volatile
private var mLatestPackage: String = ""
val latestPackage: String
get() {
if (useUsageStats && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
mLatestPackage = getLatestPackageByUsageStats()
}
return mLatestPackage
}
@Volatile
var latestActivity = ""
private set
var useUsageStats: Boolean = false
override val eventTypes: Set<Int>?
get() = AccessibilityDelegate.ALL_EVENT_TYPES
override fun onAccessibilityEvent(service: AccessibilityService, event: AccessibilityEvent): Boolean {
if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
setLatestComponent(event.packageName, event.className)
}
return false
}
fun getLatestPackageByUsageStatsIfGranted(): String {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && context.isOpPermissionGranted(AppOpsManager.OPSTR_GET_USAGE_STATS)) {
return getLatestPackageByUsageStats()
}
return mLatestPackage
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP_MR1)
fun getLatestPackageByUsageStats(): String {
val usageStatsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val current = System.currentTimeMillis()
val usageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, current - 60 * 60 * 1000, current)
return if (usageStats.isEmpty()) {
mLatestPackage
} else {
usageStats.sortBy {
it.lastTimeStamp
}
usageStats.last().packageName
}
}
private fun setLatestComponent(latestPackage: CharSequence?, latestClass: CharSequence?) {
if (latestPackage == null || latestClass == null)
return
val latestPackageStr = latestPackage.toString()
val latestClassStr = latestClass.toString()
if (latestClassStr.startsWith("android.view.") || latestClassStr.startsWith("android.widget."))
return
try {
val componentName = ComponentName(latestPackageStr, latestClassStr)
latestActivity = mPackageManager.getActivityInfo(componentName, PackageManager.MATCH_DEFAULT_ONLY).name
} catch (ignored: PackageManager.NameNotFoundException) {
return
}
mLatestPackage = latestPackage.toString()
}
}