USB设备弹窗禁用

安卓源码修改之禁用USB存储弹窗

代码查找

  • 在我们插入或者拔出USB外设存储时候,系统都会弹出一个Notification提示设备状态,我们可以根据这点定位相关的源码位置

    dumpsys notification <== 查看notification相关的dump信息

从打印的信息中,我们发现有较多的com.android.systemui信息包含在其中.因此我们优先找到对应包名下的源代码

/framework/base/package/systemui/...
  • 查看此路径下的src文件夹中,我们发现有一个usb文件夹,打开即可发现重要的文件StorageNotification.java,相关的USB挂在通知就是在此进行管理

源码分析

  • 定位

    android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
    
  • 几个重要的类

    NotificationManager 通知栏管理器
    StorageManager 存储管理器
    StorageEventListener 存储事件监听者
    BroadcastReceiver 广播接收器
    MoveCallback 貌似是回调
    
  • 运行流程

    onstart()

    1. 获取通知栏管理器
    2. 获取存储管理器
    3. 注册相应监听者
    4. 注册相应广播监听器
    5. 检测磁盘设备
    6. 扫描可用设备,处理分发设备挂载信息
    7. 注册MoveCallback,设备移除监听
    8. 更新设备状态 <== 只对公共设备处理,设备没问题,等待用户处理,有问题提示用户重新插入
  • 扫面磁盘onDiskScannedInternal

    1. 磁盘数目大于0,但是可用设备0,提示用户系统不支持设备,提示格式化处理
    2. 设备检测无误,可以下序操作
  • 处理设备挂在信息onVolumeStateChangedInternal

    1. 个人设备信息,不做处理
    2. 公共设备信息,处理发送通知及提示音
      1. 未挂载状态
      2. 检查中
      3. 成功挂载,挂载只读状态(发送设备打开Dialog)
      4. 正常移除
      5. 异常移除

小记

  • NotificationManager通过binder通信获取服务,更新通知栏状态
  • StorageManager也是通过binder通信机制实现
  • MoveCallBack可能是设备插入后拔出调用的相关逻辑
  • 当存储设备状态发生改变时候,会调用对应的StorageEventListener监听者,执行器内部逻辑,检测无误,最终调用 onVolumeStateChangedInternal方法

    1. onVolumeStateChanged
    2. onVolumeRecordChanged
    3. onVolumeForgotten
    4. onDiskScanned
  • 添加U盘插入后的逻辑可以在成功挂在后进行,在这里禁用MStar的多媒体弹窗即可
    *

坚持原创技术分享,您的支持将鼓励我继续创作!