6.7.0 - Alpha18 - 优化 "发布通知权限" 申请逻辑
This commit is contained in:
3
.idea/codeStyles/Project.xml
generated
3
.idea/codeStyles/Project.xml
generated
@@ -34,6 +34,9 @@
|
||||
<option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
|
||||
</JavaCodeStyleSettings>
|
||||
<JetCodeStyleSettings>
|
||||
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
||||
<value />
|
||||
</option>
|
||||
<option name="LINE_BREAK_AFTER_MULTILINE_WHEN_ENTRY" value="false" />
|
||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
|
||||
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
|
||||
|
||||
@@ -1,44 +1,160 @@
|
||||
package org.autojs.autojs.permission
|
||||
|
||||
import android.Manifest
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import org.autojs.autojs.core.pref.Pref
|
||||
import org.autojs.autojs.runtime.api.Permissions
|
||||
import org.autojs.autojs.ui.main.drawer.PermissionItemHelper
|
||||
import org.autojs.autojs.util.ContextUtils.findActivity
|
||||
import org.autojs.autojs.util.MaterialDialogUtils.widgetThemeColor
|
||||
import org.autojs.autojs.util.NotificationUtils
|
||||
import org.autojs.autojs6.R
|
||||
import java.util.WeakHashMap
|
||||
|
||||
/**
|
||||
* Created by SuperMonster003 on May 4, 2023.
|
||||
* Modified by JetBrains AI Assistant (GPT-5.2) as of Jan 24, 2026.
|
||||
* Modified by SuperMonster003 as of Jan 25, 2026.
|
||||
*/
|
||||
class PostNotificationsPermission(override val context: Context) : PermissionItemHelper, AbleToUrge {
|
||||
|
||||
override val isInMainThread = true
|
||||
|
||||
override fun has() = NotificationUtils.isEnabled()
|
||||
|
||||
override fun request(): Boolean = false.also { config() }
|
||||
override fun request(): Boolean = false.also {
|
||||
// Manual request from UI interaction.
|
||||
// zh-CN: 来自 UI 手动触发的请求.
|
||||
if (!requestForTiramisuAndAbove(isAuto = false)) config()
|
||||
}
|
||||
|
||||
private fun requestForTiramisuAndAbove(isAuto: Boolean): Boolean {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return false
|
||||
when (val activity = context.findActivity()) {
|
||||
is FragmentActivity -> {
|
||||
val isGrantedNow =
|
||||
ActivityCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
|
||||
if (isGrantedNow) return true
|
||||
|
||||
val hasAttemptedRequest =
|
||||
Pref.getBoolean(R.string.key_post_notifications_permission_request_attempted, false)
|
||||
|
||||
val shouldShowRationale =
|
||||
ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.POST_NOTIFICATIONS)
|
||||
|
||||
// If request has been attempted before and system will no longer show the permission dialog,
|
||||
// redirect to settings for manual flow.
|
||||
// zh-CN: 若之前已尝试过请求且系统不再弹出授权对话框, 则在手动流程下直接跳转设置页.
|
||||
if (hasAttemptedRequest && !shouldShowRationale) {
|
||||
if (!isAuto) config()
|
||||
return true
|
||||
}
|
||||
|
||||
val launchRequest = {
|
||||
// Mark request attempt (independent from auto request).
|
||||
// zh-CN: 记录已尝试发起系统权限请求 (与是否自动请求无关).
|
||||
Pref.putBoolean(R.string.key_post_notifications_permission_request_attempted, true)
|
||||
|
||||
// Mark auto request as done (only for auto flow).
|
||||
// zh-CN: 记录自动申请流程已执行 (仅用于抑制后续自动弹窗).
|
||||
if (isAuto) {
|
||||
Pref.putBoolean(R.string.key_post_notifications_permission_auto_request_done, true)
|
||||
}
|
||||
|
||||
// Set one-shot callback to fallback to settings when denied (manual flow only).
|
||||
// zh-CN: 设置一次性回调; 若用户拒绝授权, 则在手动流程下回退到设置页.
|
||||
setPostNotificationsResultCallback(activity) { granted ->
|
||||
if (!granted && !isAuto) {
|
||||
config()
|
||||
}
|
||||
}
|
||||
|
||||
val launcher = Permissions.getRequestMultiplePermissionsLauncher(activity)
|
||||
NotificationUtils.requestPermission(launcher)
|
||||
}
|
||||
|
||||
// If system recommends showing rationale, show an in-app dialog first, then re-request.
|
||||
// zh-CN: 若系统建议展示 rationale, 先弹出应用内说明对话框, 再次发起系统权限请求.
|
||||
if (shouldShowRationale) {
|
||||
showRationaleDialog(activity, onContinue = launchRequest)
|
||||
return true
|
||||
}
|
||||
|
||||
// First request (or still allowed without rationale).
|
||||
// zh-CN: 首次请求 (或无需 rationale 也允许再次请求)时直接发起系统权限请求.
|
||||
launchRequest()
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun showRationaleDialog(activity: FragmentActivity, onContinue: () -> Unit) {
|
||||
// Show a rationale dialog before requesting permission again.
|
||||
// zh-CN: 在再次请求权限前展示 rationale 对话框.
|
||||
runCatching {
|
||||
MaterialDialog.Builder(activity)
|
||||
.title(R.string.text_post_notifications_permission)
|
||||
.content(R.string.text_post_notifications_permission_rationale)
|
||||
.widgetThemeColor()
|
||||
.negativeText(R.string.dialog_button_cancel)
|
||||
.negativeColorRes(R.color.dialog_button_default)
|
||||
.positiveText(R.string.dialog_button_continue)
|
||||
.positiveColorRes(R.color.dialog_button_attraction)
|
||||
.onPositive { d, _ ->
|
||||
d.dismiss()
|
||||
onContinue()
|
||||
}
|
||||
.onNegative { d, _ -> d.dismiss() }
|
||||
.cancelable(true)
|
||||
.autoDismiss(false)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun revoke(): Boolean = false.also { config() }
|
||||
|
||||
fun config() = NotificationUtils.launchSettings()
|
||||
|
||||
override fun urge() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
when (val activity = context.findActivity()) {
|
||||
is FragmentActivity -> Permissions.getRequestMultiplePermissionsLauncher(activity).let {
|
||||
NotificationUtils.requestPermission(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
// Auto request on app start (should not jump to settings automatically).
|
||||
// zh-CN: 应用启动时的自动请求 (不应自动跳转设置页).
|
||||
requestForTiramisuAndAbove(isAuto = true)
|
||||
}
|
||||
|
||||
override fun urgeIfNeeded() {
|
||||
if (!Pref.getBoolean(R.string.key_post_notification_permission_requested, false)) {
|
||||
// Auto request should happen only once after fresh install / clear data.
|
||||
// zh-CN: 自动请求仅在全新安装或清除数据后的首次启动执行一次.
|
||||
if (!Pref.getBoolean(R.string.key_post_notifications_permission_auto_request_done, false)) {
|
||||
if (!has()) {
|
||||
urge()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
/**
|
||||
* One-shot callback for POST_NOTIFICATIONS permission result.
|
||||
* zh-CN: POST_NOTIFICATIONS 权限请求的一次性回调, 用于在用户拒绝时回退到设置页.
|
||||
*/
|
||||
val postNotificationsResultCallbackCache =
|
||||
WeakHashMap<FragmentActivity, (Boolean) -> Unit>()
|
||||
|
||||
/**
|
||||
* Set one-shot result callback for POST_NOTIFICATIONS.
|
||||
* zh-CN: 设置 POST_NOTIFICATIONS 的一次性结果回调 (触发一次后自动移除).
|
||||
*/
|
||||
@JvmStatic
|
||||
fun setPostNotificationsResultCallback(activity: FragmentActivity, callback: (Boolean) -> Unit) {
|
||||
postNotificationsResultCallbackCache[activity] = callback
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,10 +7,11 @@ import android.util.Log
|
||||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import org.autojs.autojs.core.pref.Pref
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import org.autojs.autojs.permission.PostNotificationsPermission
|
||||
import org.autojs.autojs.util.IntentUtils.startSafely
|
||||
import org.autojs.autojs.util.RomUtils
|
||||
import org.autojs.autojs6.R
|
||||
import java.util.WeakHashMap
|
||||
|
||||
class Permissions(private val context: Context) {
|
||||
|
||||
@@ -59,16 +60,65 @@ class Permissions(private val context: Context) {
|
||||
|
||||
private val TAG = Permissions::class.java.simpleName
|
||||
|
||||
/**
|
||||
* Cache activity result launchers per activity instance.
|
||||
* zh-CN: 按 Activity 实例缓存 ActivityResultLauncher, 避免在 RESUMED 时重复 register 导致崩溃.
|
||||
*/
|
||||
private val requestMultiplePermissionsLauncherCache =
|
||||
WeakHashMap<FragmentActivity, ActivityResultLauncher<Array<String>>>()
|
||||
|
||||
/**
|
||||
* Register the launcher early (e.g. in Activity.onCreate()).
|
||||
* zh-CN: 请尽早注册 (例如在 Activity.onCreate() 内), 否则在 STARTED/RESUMED 状态 register 会触发 IllegalStateException.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun getRequestMultiplePermissionsLauncher(activity: FragmentActivity): ActivityResultLauncher<Array<String>> = activity.registerForActivityResult(RequestMultiplePermissions()) {
|
||||
it.forEach { (key: String, isGranted: Boolean) ->
|
||||
Log.d(TAG, "$key: $isGranted")
|
||||
if (key == Manifest.permission.POST_NOTIFICATIONS) {
|
||||
Pref.putBoolean(R.string.key_post_notification_permission_requested, true)
|
||||
fun registerRequestMultiplePermissionsLauncher(activity: FragmentActivity): ActivityResultLauncher<Array<String>> {
|
||||
getRegisteredRequestMultiplePermissionsLauncher(activity)?.let { return it }
|
||||
return activity.registerForActivityResult(RequestMultiplePermissions()) { resultMap ->
|
||||
for ((key: String, isGranted: Boolean) in resultMap) {
|
||||
Log.d(TAG, "$key: $isGranted")
|
||||
when (key) {
|
||||
Manifest.permission.POST_NOTIFICATIONS -> {
|
||||
// Deliver one-shot callback.
|
||||
// zh-CN: 触发一次性回调 (如果存在), 然后移除, 避免重复触发和泄漏.
|
||||
PostNotificationsPermission.postNotificationsResultCallbackCache.remove(activity)?.invoke(isGranted)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}.also { launcher ->
|
||||
requestMultiplePermissionsLauncherCache[activity] = launcher
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a previously registered launcher.
|
||||
* zh-CN: 获取已注册的 launcher; 若未注册则返回 null.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun getRegisteredRequestMultiplePermissionsLauncher(activity: FragmentActivity): ActivityResultLauncher<Array<String>>? {
|
||||
return requestMultiplePermissionsLauncherCache[activity]
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getRequestMultiplePermissionsLauncher(activity: FragmentActivity): ActivityResultLauncher<Array<String>> {
|
||||
getRegisteredRequestMultiplePermissionsLauncher(activity)?.let { return it }
|
||||
|
||||
// Fail fast with a clearer message when called too late.
|
||||
// zh-CN: 如果调用时机过晚, 直接给出更明确的错误提示, 避免原始栈信息难以定位.
|
||||
if (activity.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
|
||||
throw IllegalStateException(
|
||||
"RequestMultiplePermissions launcher is not registered yet, and cannot be registered when state is " +
|
||||
"${activity.lifecycle.currentState}. Register it in onCreate() via " +
|
||||
"Permissions.registerRequestMultiplePermissionsLauncher(activity).",
|
||||
)
|
||||
}
|
||||
|
||||
// Register now (only safe before STARTED).
|
||||
// zh-CN: 仅在 STARTED 之前注册才是安全的.
|
||||
return registerRequestMultiplePermissionsLauncher(activity)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -36,6 +36,7 @@ import org.autojs.autojs.permission.AbleToUrge
|
||||
import org.autojs.autojs.permission.AllFilesAccessPermission
|
||||
import org.autojs.autojs.permission.DisplayOverOtherAppsPermission
|
||||
import org.autojs.autojs.permission.PostNotificationsPermission
|
||||
import org.autojs.autojs.runtime.api.Permissions
|
||||
import org.autojs.autojs.service.ForegroundService
|
||||
import org.autojs.autojs.theme.ThemeColorManager
|
||||
import org.autojs.autojs.theme.ThemeColorManager.addViewBackground
|
||||
@@ -71,7 +72,7 @@ import org.greenrobot.eventbus.EventBus
|
||||
|
||||
/**
|
||||
* Transformed by SuperMonster003 on May 11, 2023.
|
||||
* Modified by SuperMonster003 as of Jan 20, 2026.
|
||||
* Modified by SuperMonster003 as of Jan 26, 2026.
|
||||
*/
|
||||
class MainActivity : BaseActivity(), DelegateHost, HostActivity {
|
||||
|
||||
@@ -180,6 +181,8 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
|
||||
}
|
||||
}
|
||||
|
||||
Permissions.registerRequestMultiplePermissionsLauncher(this)
|
||||
|
||||
WorkingDirectoryUtils.determineIfNeeded()
|
||||
ExplorerView.clearViewStates()
|
||||
|
||||
|
||||
@@ -18,7 +18,8 @@ class DrawerMenuDisposableItem(
|
||||
when (val result = listener(this, helper)) {
|
||||
is Boolean -> result
|
||||
is Unit -> false
|
||||
else -> throw IllegalArgumentException("onTitleContainerClickListener must return Boolean or Unit")
|
||||
is MaterialDialog.Builder -> false
|
||||
else -> throw IllegalArgumentException("onTitleContainerClickListener must return Boolean, MaterialDialog.Builder or Unit")
|
||||
}
|
||||
},
|
||||
) {
|
||||
|
||||
@@ -7,8 +7,8 @@ import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import org.autojs.autojs.core.pref.Pref
|
||||
import org.autojs.autojs.util.MaterialDialogUtils.widgetThemeColor
|
||||
import org.autojs.autojs.ui.common.NotAskAgainDialog
|
||||
import org.autojs.autojs.util.MaterialDialogUtils.widgetThemeColor
|
||||
import org.autojs.autojs.util.ViewUtils
|
||||
import org.autojs.autojs6.R
|
||||
|
||||
@@ -115,7 +115,8 @@ open class DrawerMenuToggleableItem : DrawerMenuItem, IToggleableItem {
|
||||
when (val result = listener(this)) {
|
||||
is Boolean -> result
|
||||
is Unit -> false
|
||||
else -> throw IllegalArgumentException("onTitleContainerClickListener must return Boolean or Unit")
|
||||
is MaterialDialog.Builder -> false
|
||||
else -> throw IllegalArgumentException("onTitleContainerClickListener must return Boolean, MaterialDialog.Builder or Unit")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -223,10 +224,14 @@ open class DrawerMenuToggleableItem : DrawerMenuItem, IToggleableItem {
|
||||
.fromCallable { mItemHelper.toggle(aimState) }
|
||||
.subscribeOn(Schedulers.single())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe { tryToggleResult ->
|
||||
.subscribe({ tryToggleResult ->
|
||||
isProgress = false
|
||||
syncDelay { if (tryToggleResult) mItemHelper.callback(aimState) }
|
||||
}
|
||||
}, { e ->
|
||||
isProgress = false
|
||||
syncDelay { sync() }
|
||||
ViewUtils.showToast(mItemHelper.context, e.message ?: mItemHelper.context.getString(R.string.error_failed_to_change_the_toggle_state), true)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1198,5 +1198,7 @@
|
||||
<string name="description_screen_capture_request_delay">عند طلب إذن التقاط الشاشة، قد تحتوي نافذة طلب الإذن المنبثقة على حركة تلاشي عند اختفائها. إذا تم استدعاء `images.captureScreen` مباشرةً، فقد تتضمن لقطة الشاشة الناتجة محتوى نافذة طلب الإذن مما يسبب حجبًا.\n\nتضيف قيمة هذا الخيار مدة تأخير (بالمللي ثانية) قبل التقاط الشاشة مباشرةً بعد الحصول على الإذن، وذلك لتجنب مشكلة الحجب المذكورة أعلاه.\n\nينطبق هذا الخيار فقط على أول عملية التقاط بعد الحصول على الإذن؛ أما عمليات الالتقاط اللاحقة فلن تتأثر بهذه القيمة.</string>
|
||||
<string name="text_delay_time">مدة التأخير</string>
|
||||
<string name="dialog_button_homepage">الصفحة الرئيسية</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">تعذّر تغيير حالة المفتاح</string>
|
||||
<string name="text_post_notifications_permission_rationale">لضمان عمل خدمات المقدّمة في AutoJs6 وغيرها بشكل طبيعي، وتمكين السكربتات من نشر الإشعارات، يجب منح AutoJs6 إذن \"نشر الإشعارات\".</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1193,5 +1193,7 @@
|
||||
<string name="description_screen_capture_request_delay">When requesting screen capture permission, the permission request window may include a fade-out animation when it disappears. If `images.captureScreen` is called immediately, the captured screenshot may contain the permission request window content and be obstructed.\n\nThe current option value adds a delay (in milliseconds) before capturing the screen immediately after permission is granted, which can be used to avoid the obstruction issue described above.\n\nThis option only applies to the first screenshot after screen capture permission is granted; subsequent screenshots are not affected by this value.</string>
|
||||
<string name="text_delay_time">Delay time</string>
|
||||
<string name="dialog_button_homepage">Homepage</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">Failed to change the toggle state</string>
|
||||
<string name="text_post_notifications_permission_rationale">To ensure that AutoJs6 foreground services, etc. can work properly and that scripts can post notifications, AutoJs6 must be granted the \"post notifications\" permission.</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1196,5 +1196,7 @@
|
||||
<string name="description_screen_capture_request_delay">Al solicitar el permiso de captura de pantalla, la ventana de solicitud de permiso mostrada puede tener una animación de desvanecimiento al desaparecer. Si se llama a `images.captureScreen` inmediatamente, la captura obtenida puede incluir el contenido de dicha ventana y quedar obstruida.\n\nEl valor de esta opción añade un tiempo de espera (en milisegundos) antes de capturar la pantalla inmediatamente después de obtener el permiso, para evitar el problema de obstrucción descrito.\n\nEsta opción solo se aplica a la primera captura tras obtener el permiso; las capturas posteriores no se verán afectadas por este valor.</string>
|
||||
<string name="text_delay_time">Tiempo de retraso</string>
|
||||
<string name="dialog_button_homepage">Inicio</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">No se pudo cambiar el estado del interruptor</string>
|
||||
<string name="text_post_notifications_permission_rationale">Para garantizar que los servicios en primer plano de AutoJs6, etc. funcionen correctamente y que los scripts puedan publicar notificaciones, AutoJs6 debe recibir el permiso de \"publicar notificaciones\".</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1196,5 +1196,7 @@
|
||||
<string name="description_screen_capture_request_delay">Lors de la demande d\'autorisation de capture d\'écran, la fenêtre de demande affichée peut comporter une animation de fondu lors de sa disparition. Si `images.captureScreen` est appelé immédiatement, la capture obtenue peut contenir le contenu de cette fenêtre et être partiellement masquée.\n\nLa valeur de cette option ajoute un délai (en millisecondes) avant d\'effectuer la capture juste après l\'obtention de l\'autorisation, afin d\'éviter le problème de masquage ci-dessus.\n\nCette option ne s\'applique qu\'à la première capture après l\'obtention de l\'autorisation ; les captures suivantes ne seront plus affectées par cette valeur.</string>
|
||||
<string name="text_delay_time">Délai</string>
|
||||
<string name="dialog_button_homepage">Accueil</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">Échec de la modification de l\'état de l\'interrupteur</string>
|
||||
<string name="text_post_notifications_permission_rationale">Afin de garantir que les services au premier plan d\'AutoJs6, etc. fonctionnent correctement et que les scripts puissent publier des notifications, AutoJs6 doit se voir accorder l\'autorisation de \"publier des notifications\".</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1197,5 +1197,7 @@
|
||||
<string name="description_screen_capture_request_delay">画面キャプチャ権限を要求する際, 表示される権限リクエスト画面が閉じるときにフェード等のアニメーションが発生する場合があります. この直後に `images.captureScreen` を呼び出すと, 取得したスクリーンショットに権限リクエスト画面の内容が写り込み, 遮蔽が発生することがあります. \n\nこの設定値は, 権限取得直後に最初のスクリーンショットを取得する前に遅延時間(ミリ秒)を追加し, 上記の遮蔽問題を回避するために使用します. \n\nこの設定は権限取得後の最初のスクリーンショットにのみ適用され, 以降のスクリーンショットには影響しません.</string>
|
||||
<string name="text_delay_time">遅延時間</string>
|
||||
<string name="dialog_button_homepage">ホームページ</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">スイッチの状態の変更に失敗しました</string>
|
||||
<string name="text_post_notifications_permission_rationale">AutoJs6 のフォアグラウンドサービス等が正常に動作し, スクリプトが通知を投稿できるようにするため, AutoJs6 には \"通知の送信\" 権限を付与する必要があります.</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1198,5 +1198,7 @@
|
||||
<string name="description_screen_capture_request_delay">화면 캡처 권한을 요청할 때 표시되는 권한 요청 창은 사라질 때 페이드 등의 전환 애니메이션이 있을 수 있습니다. 이때 `images.captureScreen` 메서드를 즉시 호출하면, 얻은 스크린샷에 권한 요청 창의 내용이 포함되어 화면이 가려질 수 있습니다.\n\n이 설정 값은 권한을 획득한 직후 첫 스크린샷을 캡처하기 전에 지연 시간(밀리초)을 추가하여, 위와 같은 가림 문제를 방지하는 데 사용할 수 있습니다.\n\n이 설정은 권한 획득 후 첫 번째 캡처에만 적용되며, 이후 캡처에는 더 이상 영향을 주지 않습니다.</string>
|
||||
<string name="text_delay_time">지연 시간</string>
|
||||
<string name="dialog_button_homepage">홈페이지</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">스위치 상태 변경에 실패했습니다</string>
|
||||
<string name="text_post_notifications_permission_rationale">AutoJs6 포그라운드 서비스 등이 정상적으로 동작하고 스크립트가 알림을 게시할 수 있도록 하려면, AutoJs6 에 \"알림 게시\" 권한을 부여해야 합니다.</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1196,5 +1196,7 @@
|
||||
<string name="description_screen_capture_request_delay">При запросе разрешения на захват экрана отображаемое окно запроса может иметь анимацию затухания при исчезновении. Если сразу вызвать `images.captureScreen`, полученный снимок может содержать содержимое этого окна и быть частично перекрыт.\n\nЗначение этой опции добавляет задержку (в миллисекундах) перед выполнением снимка экрана сразу после получения разрешения, что позволяет избежать описанной выше проблемы перекрытия.\n\nЭта опция применяется только к первому снимку после получения разрешения; последующие снимки не будут зависеть от этого значения.</string>
|
||||
<string name="text_delay_time">Время задержки</string>
|
||||
<string name="dialog_button_homepage">Главная</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">Не удалось изменить состояние переключателя</string>
|
||||
<string name="text_post_notifications_permission_rationale">Чтобы обеспечить корректную работу фоновых служб переднего плана AutoJs6 и возможность публикации уведомлений скриптами, AutoJs6 необходимо предоставить разрешение \"публикации уведомлений\".</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1194,5 +1194,7 @@
|
||||
<string name="description_screen_capture_request_delay">申請屏幕捕獲權限時, 彈出的權限申請窗口消失時可能存在漸變動畫, 此時如果立即調用 `images.captureScreen` 方法, 獲取的屏幕截圖中會出現權限申請的窗口內容而造成遮擋.\n\n當前設置選項值用於在截圖權限申請後立即獲取屏幕截圖前增加一個延遲時間 (單位為毫秒), 可用於避免上述遮擋問題.\n\n當前設置選項僅適用於獲取截圖權限後的首次截圖操作, 後續截圖操作不再受此設置值影響.</string>
|
||||
<string name="text_delay_time">延遲時間</string>
|
||||
<string name="dialog_button_homepage">主頁</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">開關狀態改變失敗</string>
|
||||
<string name="text_post_notifications_permission_rationale">為確保 AutoJs6 前台服務等能夠正常運行, 腳本能夠發佈通知, AutoJs6 需要被授予 \"發佈通知權限\".</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1194,5 +1194,7 @@
|
||||
<string name="description_screen_capture_request_delay">申請螢幕捕獲許可權時, 彈出的許可權申請視窗消失時可能存在漸變動畫, 此時如果立即呼叫 `images.captureScreen` 方法, 獲取的螢幕截圖中會出現許可權申請的視窗內容而造成遮擋.\n\n當前設定選項值用於在截圖許可權申請後立即獲取螢幕截圖前增加一個延遲時間 (單位為毫秒), 可用於避免上述遮擋問題.\n\n當前設定選項僅適用於獲取截圖許可權後的首次截圖操作, 後續截圖操作不再受此設定值影響.</string>
|
||||
<string name="text_delay_time">延遲時間</string>
|
||||
<string name="dialog_button_homepage">主頁</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">開關狀態改變失敗</string>
|
||||
<string name="text_post_notifications_permission_rationale">為確保 AutoJs6 前臺服務等能夠正常執行, 指令碼能夠釋出通知, AutoJs6 需要被授予 \"釋出通知許可權\".</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1194,5 +1194,7 @@
|
||||
<string name="description_screen_capture_request_delay">申请屏幕捕获权限时, 弹出的权限申请窗口消失时可能存在渐变动画, 此时如果立即调用 `images.captureScreen` 方法, 获取的屏幕截图中会出现权限申请的窗口内容而造成遮挡.\n\n当前设置选项值用于在截图权限申请后立即获取屏幕截图前增加一个延迟时间 (单位为毫秒), 可用于避免上述遮挡问题.\n\n当前设置选项仅适用于获取截图权限后的首次截图操作, 后续截图操作不再受此设置值影响.</string>
|
||||
<string name="text_delay_time">延迟时间</string>
|
||||
<string name="dialog_button_homepage">主页</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">开关状态改变失败</string>
|
||||
<string name="text_post_notifications_permission_rationale">为确保 AutoJs6 前台服务等能够正常运行, 脚本能够发布通知, AutoJs6 需要被授予 \"发布通知权限\".</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -137,8 +137,9 @@
|
||||
<string name="key_night_mode_null" translatable="false">key_$_night_mode_null</string>
|
||||
<string name="key_not_showing_main_activity" translatable="false">key_$_not_showing_main_activity</string>
|
||||
<string name="key_pc_server_address_histories" translatable="false">key_$_pc_server_address_histories</string>
|
||||
<string name="key_post_notification_permission_requested" translatable="false">key_$_post_notification_permission_urged</string>
|
||||
<string name="key_post_notifications_permission" translatable="false">key_$_post_notifications_permission</string>
|
||||
<string name="key_post_notifications_permission_auto_request_done" translatable="false">key_$_post_notifications_permission_auto_request_done</string>
|
||||
<string name="key_post_notifications_permission_request_attempted" translatable="false">key_$_post_notifications_permission_request_attempted</string>
|
||||
<string name="key_pref_bundle_default_item" translatable="false">key_$_pref_bundle_default_item</string>
|
||||
<string name="key_pref_bundle_disabled_items" translatable="false">key_$_pref_bundle_disabled_items</string>
|
||||
<string name="key_record_toast" translatable="false">key_$_record_toast</string>
|
||||
@@ -1452,5 +1453,7 @@
|
||||
<string name="description_screen_capture_request_delay">When requesting screen capture permission, the permission request window may include a fade-out animation when it disappears. If `images.captureScreen` is called immediately, the captured screenshot may contain the permission request window content and be obstructed.\n\nThe current option value adds a delay (in milliseconds) before capturing the screen immediately after permission is granted, which can be used to avoid the obstruction issue described above.\n\nThis option only applies to the first screenshot after screen capture permission is granted; subsequent screenshots are not affected by this value.</string>
|
||||
<string name="text_delay_time">Delay time</string>
|
||||
<string name="dialog_button_homepage">Homepage</string>
|
||||
<string name="error_failed_to_change_the_toggle_state">Failed to change the toggle state</string>
|
||||
<string name="text_post_notifications_permission_rationale">To ensure that AutoJs6 foreground services, etc. can work properly and that scripts can post notifications, AutoJs6 must be granted the \"post notifications\" permission.</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#Sat Jan 24 20:43:27 CST 2026
|
||||
BUILD_TIME=1769258607559
|
||||
#Mon Jan 26 14:25:52 CST 2026
|
||||
BUILD_TIME=1769408752043
|
||||
COMPILE_SDK_VERSION=36
|
||||
IMAGE_QUANT_CMAKE_VERSION=3.22.1
|
||||
IMAGE_QUANT_NDK_VERSION=26.1.10909125
|
||||
@@ -27,6 +27,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13
|
||||
RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3
|
||||
TARGET_SDK_VERSION=36
|
||||
TARGET_SDK_VERSION_INRT=29
|
||||
VERSION_BUILD=3653
|
||||
VERSION_BUILD=3657
|
||||
VERSION_NAME=6.7.0 Alpha18
|
||||
VSCODE_EXT_REQUIRED_VERSION=1.0.13
|
||||
|
||||
Reference in New Issue
Block a user