Browse Source

client:谷歌上架去掉未使用的前台服务权限和整机应用列表权限。构建号 1.0.3+27

Play 把 dataSync、定位导航、通话类型和 QUERY_ALL_PACKAGES 当成未声明的敏感权限。地图是否安装改为只查询百度、高德、Google 三个包名;录音前台服务只保留麦克风类型。

Co-authored-by: Cursor <cursoragent@cursor.com>
along
Rodger-Wang 11 hours ago
parent
commit
bceb4eb8fa
  1. 32
      apps/client/android/app/src/main/AndroidManifest.xml
  2. 8
      apps/client/local_plugins/azure_speech/android/src/main/AndroidManifest.xml
  3. 34
      apps/client/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/tools/AudioRecordingForegroundService.kt
  4. 1
      apps/client/local_plugins/ble_service/android/src/main/AndroidManifest.xml
  5. 1
      apps/client/local_plugins/recorder_holder/android/src/main/AndroidManifest.xml
  6. 2
      apps/client/pubspec.yaml

32
apps/client/android/app/src/main/AndroidManifest.xml

@ -11,15 +11,19 @@
tools:node="remove" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!-- Android 13+ 前台服务特定类型权限 -->
<!-- 还在用、需要在 Play Console 声明的类型:播放、连蓝牙设备、麦克风、投屏收音。 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>
<!-- Android 14+ 蓝牙设备连接前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"/>
<!-- Android 15+ 数据同步前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<!-- Android 14+ 麦克风前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"/>
<!-- 没有对应的用户可见任务,插件合并进来也要摘掉:
dataSync 没有服务在用;location 只挂在没人调用的高德导航服务上;
phoneCall 要求本应用是拨号应用,Play 不会批。 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"
tools:node="remove" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"
tools:node="remove" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL"
tools:node="remove" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
@ -48,9 +52,6 @@
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 添加发送短信权限 -->
<!-- <uses-permission android:name="android.permission.SEND_SMS" /> -->
<!-- 添加查询应用包权限 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<!--允许获取网络状态,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许获取wifi网络信息,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
@ -111,6 +112,15 @@
<receiver
android:name="androidx.work.impl.diagnostics.DiagnosticsReceiver"
tools:node="remove" />
<!-- 没用到 WorkManager 的前台任务,留着会把 dataSync 类型带进审核。 -->
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
tools:node="remove" />
<!-- 高德导航前台服务带 location 类型,工程里没有调用方。 -->
<service
android:name="com.yunqiinnovation.amap_service.NavigationService"
tools:node="remove" />
@ -195,8 +205,10 @@
</queries>
<queries>
<!-- 声明百度地图包名 -->
<!-- 只声明要探测是否安装的地图包,不用 QUERY_ALL_PACKAGES 扫整机列表。 -->
<package android:name="com.baidu.BaiduMap" />
<package android:name="com.autonavi.minimap" />
<package android:name="com.google.android.apps.maps" />
<!-- 声明要处理的URL Scheme -->
<intent>
<action android:name="android.intent.action.VIEW" />

8
apps/client/local_plugins/azure_speech/android/src/main/AndroidManifest.xml

@ -6,11 +6,7 @@
<!-- 添加前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
<!-- 通话类前台服务:国内 ROM(鸿蒙 Pged-Freezer 尤其激进)对「麦克风」类型照样冻结,
通话类通常更宽容。⚠️ Android 14+ 用这个类型还要求 App 是默认拨号或持有
MANAGE_OWN_CALLS,我们都不是,所以**运行时必然可能被拒**——
AudioRecordingForegroundService 里带了回退到纯麦克风的分支,别把它删了。 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />
<!-- phoneCall 要求本应用是默认拨号或持有 MANAGE_OWN_CALLS,Play 也不会批。 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
@ -20,7 +16,7 @@
android:name=".tools.AudioRecordingForegroundService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="microphone|phoneCall" />
android:foregroundServiceType="microphone" />
<!-- 注册屏幕/系统音频捕获前台服务(Android 14+ 必须 mediaProjection 类型) -->
<service
android:name=".tools.ScreenCaptureForegroundService"

34
apps/client/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/tools/AudioRecordingForegroundService.kt

@ -70,38 +70,26 @@ class AudioRecordingForegroundService : Service() {
}
/**
* 以「麦克风 + 通话」类型进入前台,被系统拒绝则回退到纯麦克风。
* 只以麦克风类型进入前台。
*
* ⚠️ 为什么要带通话类型:真机实测(2026-09-19,HarmonyOS / ALN-AL80),
* 纯 microphone(128) 类型的前台服务**照样**被 `Pged-Freezer` 冻结——
* 服务已登记、常驻通知也挂着,按 Home 约 5s 后进程就被冻住,
* WebSocket 当场断,通话翻译整条停摆。通话类型在多数 ROM 上待遇更好。
*
* ⚠️ 为什么必须能回退:Android 14+ 要求用 phoneCall 类型的 App 是默认拨号应用
* 或持有 MANAGE_OWN_CALLS,我们两样都不是。那时 startForeground 会抛
* SecurityException / ForegroundServiceTypeNotAllowedException,
* **不接住就是前台服务起不来**,比原来还糟。
* phoneCall 类型在 Android 14+ 要求本应用是默认拨号或持有 MANAGE_OWN_CALLS,
* Play 也不会给非通话应用批。以前为躲开鸿蒙冻结叠过通话类型,运行时会被拒绝,
* 现在清单里不再声明。
*/
private fun startForegroundCompat(notification: android.app.Notification) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
startForeground(NOTIFICATION_ID, notification)
return
}
val micOnly = ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE
val withCall = micOnly or ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL
try {
startForeground(NOTIFICATION_ID, notification, withCall)
Log.d(TAG, "前台服务已启动(类型=麦克风+通话)")
startForeground(
NOTIFICATION_ID,
notification,
ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE,
)
Log.d(TAG, "前台服务已启动(类型=麦克风)")
} catch (e: Exception) {
Log.w(TAG, "通话类型被拒,回退纯麦克风: ${e.message}")
try {
startForeground(NOTIFICATION_ID, notification, micOnly)
Log.d(TAG, "前台服务已启动(类型=麦克风)")
} catch (e2: Exception) {
// 连纯麦克风都起不来(多半是通知权限被关 + ROM 限制),
// 别让它把整个进程带崩——录音/翻译在前台照样能跑。
Log.e(TAG, "前台服务启动失败: ${e2.message}")
}
Log.e(TAG, "前台服务启动失败: ${e.message}")
}
}

1
apps/client/local_plugins/ble_service/android/src/main/AndroidManifest.xml

@ -9,7 +9,6 @@
<!-- 权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<!-- Companion 特权:后台运行 & 启动前台服务 -->

1
apps/client/local_plugins/recorder_holder/android/src/main/AndroidManifest.xml

@ -9,7 +9,6 @@
<!-- 前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<!-- Companion 特权:后台运行 & 启动前台服务 -->

2
apps/client/pubspec.yaml

@ -1,7 +1,7 @@
name: eaimar
description: "Eaimar - AI Voice Assistant."
publish_to: "none"
version: 1.0.2+26
version: 1.0.3+27
environment:
sdk: ">=3.3.0 <4.0.0"

Loading…
Cancel
Save