Skip to content

Commit 715efff

Browse files
committed
feat(assists-web): 添加二维码扫描功能并优化应用性能
- 在 AndroidManifest.xml 中启用硬件加速以提升应用性能 - 在 App.kt 中设置全局步骤默认间隔时长为 1000 毫秒 - 新增 scanQR 方法以支持二维码扫描功能 - 更新 CustomFileProvider.kt 以支持 ActivityResult API - 在 README.md 中添加示例代码,展示如何使用新功能
1 parent 343c459 commit 715efff

File tree

7 files changed

+115
-6
lines changed

7 files changed

+115
-6
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class MyStepImpl:StepImpl() {
172172
//步骤1逻辑
173173
...
174174
//返回下一步需要执行的序号,通过Step.get([序号]),如果需要重复该步骤可返回Step.repeat,如果返回Step.none则不执行任何步骤,相当于停止
175-
return@next Step.get(2) //将会执行步骤2逻辑
175+
return@next Step.get(2, delay = 1000) //将会执行步骤2逻辑
176176
}.next(2) {
177177
//步骤2逻辑
178178
...

assists-web/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies {
3636
implementation "com.google.code.gson:gson:2.11.0"
3737
implementation project(':assists')
3838
implementation project(':assists-mp')
39+
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
3940
}
4041
task sourcesJar(type: Jar) {
4142
archiveClassifier.set('sources')
@@ -48,7 +49,7 @@ afterEvaluate {
4849
from components.release
4950
groupId = 'com.github.ven-coder'
5051
artifactId = 'assists-web'
51-
version = '0.0.21-SNAPSHOT'
52+
version = '0.0.22-SNAPSHOT'
5253
artifact sourcesJar
5354
}
5455
}

assists-web/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.ven.assists_web">
44

5-
<application>
5+
<application android:hardwareAccelerated="true">
66
<provider
77
android:name="com.ven.assists.web.CustomFileProvider"
88
android:authorities="${applicationId}.assistsweb.fileprovider"

assists-web/src/main/java/com/ven/assists/web/ASJavascriptInterface.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.blankj.utilcode.util.ScreenUtils
1212
import com.google.gson.JsonArray
1313
import com.google.gson.JsonObject
1414
import com.google.gson.reflect.TypeToken
15+
import com.journeyapps.barcodescanner.ScanOptions
1516
import com.ven.assists.AssistsCore
1617
import com.ven.assists.AssistsCore.click
1718
import com.ven.assists.AssistsCore.containsText
@@ -33,17 +34,18 @@ import com.ven.assists.AssistsCore.scrollForward
3334
import com.ven.assists.AssistsCore.selectionText
3435
import com.ven.assists.AssistsCore.setNodeText
3536
import com.ven.assists.AssistsCore.takeScreenshot
37+
import com.ven.assists.mp.MPManager
38+
import com.ven.assists.mp.MPManager.getBitmap
3639
import com.ven.assists.utils.CoroutineWrapper
3740
import com.ven.assists.window.AssistsWindowManager
3841
import com.ven.assists.window.AssistsWindowManager.overlayToast
39-
import com.ven.assists.mp.MPManager
40-
import com.ven.assists.mp.MPManager.getBitmap
4142
import kotlinx.coroutines.CoroutineScope
4243
import kotlinx.coroutines.Dispatchers
4344
import kotlinx.coroutines.delay
4445
import kotlinx.coroutines.launch
4546
import java.io.ByteArrayOutputStream
4647

48+
4749
class ASJavascriptInterface(val webView: WebView) {
4850
private val coroutineScope = CoroutineScope(Dispatchers.Main)
4951

@@ -64,6 +66,19 @@ class ASJavascriptInterface(val webView: WebView) {
6466
runCatching {
6567
val request = GsonUtils.fromJson<CallRequest<JsonObject>>(json, object : TypeToken<CallRequest<JsonObject>>() {}.type)
6668
when (request.method) {
69+
CallMethod.scanQR -> {
70+
CoroutineWrapper.launch {
71+
val scanIntentResult = CustomFileProvider.requestLaunchersScan(ScanOptions())
72+
callback(CallResponse<JsonObject>(code = 0, data = JsonObject().apply {
73+
addProperty("value", scanIntentResult?.contents ?: "")
74+
}, callbackId = request.callbackId))
75+
}
76+
77+
result = GsonUtils.toJson(CallResponse<JsonObject>(code = 0, data = JsonObject().apply {
78+
addProperty("resultType", "callback")
79+
}))
80+
}
81+
6782
CallMethod.setOverlayFlags -> {
6883
request.arguments?.apply {
6984
val flagList = arrayListOf<Int>()

assists-web/src/main/java/com/ven/assists/web/CallMethod.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,5 @@ object CallMethod {
3737
const val nodeGestureClickByDouble="nodeGestureClickByDouble"
3838
const val takeScreenshot="takeScreenshot"
3939
const val setOverlayFlags="setOverlayFlags"
40+
const val scanQR="scanQR"
4041
}

assists-web/src/main/java/com/ven/assists/web/CustomFileProvider.kt

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
11
package com.ven.assists.web
22

3+
import android.app.Activity
34
import android.app.Application
5+
import android.content.Intent
6+
import android.os.Bundle
7+
import androidx.activity.ComponentActivity
8+
import androidx.activity.result.ActivityResult
9+
import androidx.activity.result.ActivityResultLauncher
10+
import androidx.activity.result.contract.ActivityResultContracts
411
import androidx.core.content.FileProvider
12+
import com.blankj.utilcode.util.ActivityUtils
13+
import com.journeyapps.barcodescanner.ScanContract
14+
import com.journeyapps.barcodescanner.ScanIntentResult
15+
import com.journeyapps.barcodescanner.ScanOptions
16+
import com.ven.assists.mp.MPManager
517
import com.ven.assists.utils.CoroutineWrapper
18+
import kotlinx.coroutines.CompletableDeferred
619
import kotlinx.coroutines.delay
720

821
class CustomFileProvider : FileProvider() {
22+
23+
924
override fun onCreate(): Boolean {
1025
val applicationContext = context?.applicationContext
1126
if (applicationContext is Application) {
@@ -29,7 +44,80 @@ class CustomFileProvider : FileProvider() {
2944
delay(1000)
3045
}
3146
}
47+
48+
applicationContext.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks)
49+
applicationContext.registerActivityLifecycleCallbacks(activityLifecycleCallbacks)
3250
}
3351
return super.onCreate()
3452
}
53+
54+
private val activityLifecycleCallbacks = object : Application.ActivityLifecycleCallbacks {
55+
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
56+
if (activity is ComponentActivity && requestLaunchers[activity] == null) {
57+
requestLaunchers[activity] = activity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
58+
currentCompletableDeferred?.complete(result)
59+
}
60+
}
61+
if (activity is ComponentActivity && requestLaunchersScan[activity] == null) {
62+
requestLaunchersScan[activity] = activity.registerForActivityResult(ScanContract()) { result ->
63+
currentCompletableDeferredScan?.complete(result)
64+
}
65+
}
66+
}
67+
68+
override fun onActivityStarted(activity: Activity) {
69+
}
70+
71+
override fun onActivityResumed(activity: Activity) {
72+
}
73+
74+
override fun onActivityPaused(activity: Activity) {
75+
}
76+
77+
override fun onActivityStopped(activity: Activity) {
78+
}
79+
80+
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
81+
}
82+
83+
override fun onActivityDestroyed(activity: Activity) {
84+
requestLaunchers.remove(activity)
85+
requestLaunchersScan.remove(activity)
86+
}
87+
}
88+
89+
companion object {
90+
private val requestLaunchers = hashMapOf<Activity, ActivityResultLauncher<Intent>>()
91+
private var currentCompletableDeferred: CompletableDeferred<ActivityResult>? = null
92+
private val requestLaunchersScan = hashMapOf<Activity, ActivityResultLauncher<ScanOptions>>()
93+
private var currentCompletableDeferredScan: CompletableDeferred<ScanIntentResult>? = null
94+
95+
suspend fun requestLaunchers(intent: Intent): ActivityResult? {
96+
val result = runCatching {
97+
currentCompletableDeferred?.completeExceptionally(RuntimeException("reset"))
98+
currentCompletableDeferred = null
99+
currentCompletableDeferred = CompletableDeferred<ActivityResult>()
100+
ActivityUtils.getTopActivity()?.let {
101+
requestLaunchers[it]?.launch(intent)
102+
} ?: return@runCatching null
103+
return@runCatching currentCompletableDeferred?.await()
104+
}
105+
return result.getOrNull()
106+
107+
}
108+
suspend fun requestLaunchersScan(scanOptions: ScanOptions): ScanIntentResult? {
109+
val result = runCatching {
110+
currentCompletableDeferredScan?.completeExceptionally(RuntimeException("reset"))
111+
currentCompletableDeferredScan = null
112+
currentCompletableDeferredScan = CompletableDeferred<ScanIntentResult>()
113+
ActivityUtils.getTopActivity()?.let {
114+
requestLaunchersScan[it]?.launch(scanOptions)
115+
} ?: return@runCatching null
116+
return@runCatching currentCompletableDeferredScan?.await()
117+
}
118+
return result.getOrNull()
119+
120+
}
121+
}
122+
35123
}

simple/src/main/java/com/ven/assists/simple/App.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.ven.assists.simple
22

33
import android.app.Application
44
import com.blankj.utilcode.util.Utils
5+
import com.ven.assists.AssistsCore
56
import com.ven.assists.simple.step.GestureBottomTab
67
import com.ven.assists.simple.step.GestureScrollSocial
78
import com.ven.assists.simple.step.OpenWechatSocial
@@ -11,11 +12,14 @@ import com.ven.assists.stepper.StepManager
1112

1213
class App : Application() {
1314

14-
companion object{
15+
companion object {
1516
const val TARGET_PACKAGE_NAME = "com.tencent.mm"
1617
}
18+
1719
override fun onCreate() {
1820
super.onCreate()
1921
Utils.init(this)
22+
//设置全局步骤默认间隔时长
23+
StepManager.DEFAULT_STEP_DELAY = 1000L
2024
}
2125
}

0 commit comments

Comments
 (0)