先给答案:主要不是 Android 权限问题,而是 Focus(焦点)管理 + 扫描输出模式配置的问题。
"显示在通知栏"这个现象本身就是最强的诊断信号——扫码服务拿到了数据,但找不到有效的焦点输入目标,于是做了 fallback 展示。
现象解读:为什么数据去了通知栏而不是输入框?
PDA 的扫码引擎有两种经典输出路径:
你的场景——"不进输入框,只显示在通知栏"——几乎可以确定:设备当前运行在 键盘楔入/焦点录入模式,但 EditText 没有真正持有焦点,所以扫描服务找不到注入目标,只能把数据丢到通知栏做 fallback。
所以到底是不是权限问题?
基本不是。原因:
扫描服务是 系统级/厂商固件层 跑的,自带底层权限,不需要你 App 申请 CAMERA或什么特殊运行时权限
Android 10+ 有限制后台广播接收,但那是针对你自己 App 注册的 Receiver,不影响扫描服务本身的输出
权限顶多体现在你需要给 App 授予 无障碍服务权限(某些第三方输入法/安全策略会拦截模拟按键),但这表现为"完全没反应"而非"去通知栏"
根因 90% 在 Focus 管理,10% 在输出模式配错(该用广播却用了键盘楔入)
以海雅达Model 4按键手持终端PDA为例
Model 4 用的民德 ME5066 扫描引擎 + 海雅达自研扫描服务中间层(不是纯 AOSP 的 Camera扫码),它的输出管道路径和你描述的「解码成功 不进输入框 数据跑到通知栏」高度吻合——这不是权限问题,是输出模式/焦点链的双因子问题。
先定性:为什么是通知栏而不是丢地上?
民德系扫描服务在 键盘楔入模式 下,内部逻辑大致是:
解码成功
└─ 找当前Window中带焦点的 EditText
├─ 找到了 inject key events 填入输入框
└─ 找不到 fallback:通过 NotificationManager 弹一条通知展示条码
(就是你看到的"显示在通知栏")
所以通知栏 = 扫描服务亲口告诉你:我没找到可注入的焦点目标。
Step 1(最关键):进海雅达的【扫描工具】改输出模式
在 Model 4 桌面上找到这个 App:
「扫描工具」 或 「Scan Setting」 或 「扫码设置」(海雅达预装的那个齿轮/扫码图标)
进去后按顺序核对:
重点:一旦切到广播模式,扫码数据就不再依赖 EditText 焦点了,而是走 sendBroadcast() 你得在 Activity 里 registerReceiver()接数据自己填。这对 WMS 来说是更稳的架构(下面给代码)。
Step 2:如果你坚持用键盘楔入模式(不改广播),修焦点
有些团队的 WMS 是 H5 壳(WebView)或 React Native/ uni-app套壳,表面看着有输入框,实际上焦点状态不对:
在【扫描工具】里额外确认:
「输出至当前焦点窗口」已勾选
「发送数据到焦点 EditText」类选项已开
关掉「输出到剪贴板」「复制到剪贴板」这类旁路选项
一句话定位你这台 Model 4
去桌面 打开「扫描工具」 看「输出方式」是不是挂在「模拟键盘输入」上但你的输入框实际上没拿到焦点 要么修焦点链,要么切「广播输出」自己接。 通知栏那条就是扫描服务找不到注入目标的 fallback,跟运行时权限无关。
如果你的 WMS 是 H5 WebView 套壳(不是原生 EditText),那就必须走广播模式——WebView 的 <input>根本不在 Android 的键盘事件分发链里,模拟键盘注入十有八九不灵,切广播后在 onReceive里用 evaluateJavascript()灌值进去就行。你告诉我壳子是啥技术栈(原生 / RN / uni-app / WebView-H5),我可以把接收注入的写法精确到你的场景。