Files
jiecheng-business/app/src/main/AndroidManifest.xml

228 lines
11 KiB
XML
Raw Normal View History

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.pukka.jiecheng"
tools:ignore="MissingLeanbackLauncher">
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- MSA -->
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission-sdk-23 android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission-sdk-23 android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.REPLACE_EXISTING_PACKAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- ===== 语音协议(文档 §6.2):自定义 signature-level permission ===== -->
<!-- debug flavor 通过 voiceProtectionLevel=normal 临时放开(联调期 adb shell 可投递);
release 走 signature 严格白名单。 -->
<permission
android:name="com.pukka.jiecheng.permission.VOICE_COMMAND"
android:protectionLevel="${voiceProtectionLevel}" />
<uses-permission android:name="com.pukka.jiecheng.permission.VOICE_COMMAND" />
<!-- ===== 语音冷启动保活(文档 2026-08-28-语音冷启动链路设计方案) ===== -->
<!-- BOOT_COMPLETED 启 FGS 必须先声明权限;FOREGROUND_SERVICE 是 Android 9+ 启前台服务的前置 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- 语音冷启动绕过 Background Activity Start 限制::voice 进程挂 1px 悬浮窗,
AMS 视为有 visible window,后续 startActivity 走豁免路径。
标准权限,部分 OEM ROM 自动授予;无需运行时申请。 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<application
android:name=".MyApplication"
android:allowBackup="false"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_app"
android:label="@string/app_name"
android:largeHeap="true"
android:networkSecurityConfig="@xml/network_permission_config"
android:defaultToDeviceProtectedStorage="true"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_app"
android:supportsRtl="true"
android:taskAffinity=""
android:theme="@style/whiteTheme"
android:usesCleartextTraffic="true"
tools:node="merge"
tools:replace="android:name,android:allowBackup,android:theme,android:icon,android:networkSecurityConfig,android:label,android:roundIcon"
tools:targetApi="n">
<activity
android:name=".index.HotelMyActivity"
android:exported="false"
android:screenOrientation="landscape" />
<activity
android:name=".aboutmy.AboutMyActivity"
android:exported="false"
android:screenOrientation="landscape" />
<activity
android:name=".device.DeviceActivity"
android:exported="false"
android:screenOrientation="landscape" />
<activity
android:name=".setting.SettingActivity"
android:exported="false"
android:screenOrientation="landscape" />
<activity
android:name=".order.OrderActivity"
android:exported="false"
android:screenOrientation="landscape"
android:theme="@style/whiteTheme" />
<activity
android:name=".list.ListActivity"
android:exported="false"
android:screenOrientation="landscape" />
<activity
android:name=".login.LoginActivity"
android:exported="false"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|adjustResize" />
<!-- 家用版微信扫码登录 Activity(第一阶段占位),仅应用内启动 -->
<activity
android:name=".login.WxMpLoginActivity"
android:exported="false"
android:screenOrientation="landscape" />
<activity
android:name=".MainActivity"
android:exported="true"
android:screenOrientation="landscape"
android:theme="${splash_theme}">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".TestActivity"
android:exported="true"
android:screenOrientation="landscape"
android:theme="@style/whiteTheme" />
<activity
android:name=".video.VideoDetailActivity"
android:screenOrientation="landscape"
android:theme="@style/whiteTheme" />
<activity
android:name=".history.HistoryActivity"
android:screenOrientation="landscape"
android:theme="@style/whiteTheme" />
<activity
android:name=".index.IndexActivity"
android:screenOrientation="landscape"
android:theme="@style/whiteTheme" />
<activity
android:name=".search.SearchActivity"
android:screenOrientation="landscape"
android:theme="@style/whiteTheme" />
<activity
android:name=".web.SimpleWebActivity"
android:screenOrientation="landscape"
android:theme="@style/blackTheme" />
<activity
android:name=".filter.FilterActivity"
android:screenOrientation="landscape"
android:theme="@style/whiteTheme" />
<meta-data
android:name="APP_CHANNEL_NAME"
android:value="${APP_CHANNEL_ID}" />
<!-- <meta-data
android:name="APP_CHANNEL_TYPE"
android:value="${APP_CHANNEL_TYPE}" /> -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<!-- 语音命令接收器(文档 §5.2) -->
<receiver
android:name=".voice.receiver.VoiceCommandReceiver"
android:exported="true"
android:permission="com.pukka.jiecheng.permission.VOICE_COMMAND">
<intent-filter>
<action android:name="com.pukka.jiecheng.action.VOICE_COMMAND" />
</intent-filter>
</receiver>
<!-- 语音冷启动链路:开机拉起 :voice 进程 FGS(文档 2026-08-28-语音冷启动链路设计方案) -->
<receiver
android:name=".voice.receiver.BootCompletedReceiver"
android:enabled="true"
android:exported="true"
android:directBootAware="true"
android:process=":voice"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- 自广播兜底接收器:处理 KEEPALIVE_BOOT 自定义 action。
解决 BOOT_COMPLETED 因 STOPPED / OEM 拦截失败时 :voice 进程无法自启的问题。
同包 explicit broadcast(Intent.setPackage)不受 STOPPED 状态限制。
exported=false 不暴露给外部,仅接收应用自身 AlarmManager 派发的 PendingIntent。 -->
<receiver
android:name=".voice.receiver.KeepAlivePingReceiver"
android:enabled="true"
android:exported="false"
android:process=":voice">
<intent-filter>
<action android:name="com.pukka.jiecheng.action.KEEPALIVE_BOOT" />
</intent-filter>
</receiver>
<!-- 语音冷启动保活服务:保持 :voice 进程隔离。
设计意图:主进程被 LMK 杀掉后 receiver 仍能存活,持续监听 OEM 创维广播。
cold-launch 受 Android 12+ Background Activity Start 限制的问题,由
VoiceOverlayHelper 在 :voice 进程挂 1px TYPE_APPLICATION_OVERLAY 悬浮窗
提供 visible window 豁免(AMS 视为前台可见窗口),配合
SkyworthVoiceAdapter.coldLaunchMainActivity 优先路径
showOverlay → ctx.startActivity(cold) → hideOverlay 绕过。
FullScreenIntent 通知作为 OEM ROM 拦截悬浮窗场景下的次选兜底保留。
当前设备 Android 11 不需要 USE_FULL_SCREEN_INTENT 权限;如后续适配
Android 14 设备需在 manifest 声明该权限。 -->
<service
android:name=".voice.service.VoiceKeepAliveService"
android:exported="false"
android:foregroundServiceType="specialUse"
android:process=":voice" />
</application>
</manifest>