若您在此注册语雀,可以让我记录更多内容。

    移除正在使用中的存储设备,在任何操作系统上都是非法操作,都会引发一定程度的故障,甚至系统宕机(极端情况下会引发SWT)。而存储设备轻则文件被损坏,重则硬件烧坏,这是无法彻底解决的,只能在人为习惯上尽量避免。

    本题即为播放T卡中的视频时,突然被拔出,导致ExternalStorageService的IO操作被挂起,StorageService检测到挂起状态后对其进行重启。
    ExternalStorageService 重启之后重新尝试卸载T卡,而此时T卡实际已经不在了,故卸载失败;因而SystemUI收不到卸载完成的通知,故图标不消失。

    针对此现象的修改方法如下:

    1、
    修改 vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/StorageNotification.java

    1. private NotificationManager mNotificationManager;
    2. private StorageManager mStorageManager;
    3. /// START. 弹SD卡后图标不消失. By XShawn@20210203.
    4. private static final String ACTION_RESET_STORAGE_SERVICE = "emdoor.intent.action.RESET_STORAGE_SERVICE";
    5. private VolumeInfo lastPublicVolume = null;
    6. private final BroadcastReceiver mServiceResetReceiver = new BroadcastReceiver() {
    7. @Override
    8. public void onReceive(Context context, Intent intent) {
    9. String sessionId = intent.getStringExtra("SESSION_ID");
    10. String volId = lastPublicVolume.getId();
    11. if (null == lastPublicVolume || !volId.equals(sessionId)) {
    12. return;
    13. }
    14. mNotificationManager.cancelAsUser(volId, SystemMessage.NOTE_STORAGE_PUBLIC,
    15. UserHandle.of(lastPublicVolume.getMountUserId()));
    16. lastPublicVolume = null;
    17. }
    18. };
    19. /// END. 弹SD卡后图标不消失. By XShawn@20210203.
    20. public StorageNotification(Context context) {
    21. super(context);
    22. }

    注册广播

    1. @Override
    2. public void start() {
    3. mNotificationManager = mContext.getSystemService(NotificationManager.class);
    4. mStorageManager = mContext.getSystemService(StorageManager.class);
    5. mStorageManager.registerListener(mListener);
    6. mContext.registerReceiver(mSnoozeReceiver, new IntentFilter(ACTION_SNOOZE_VOLUME),
    7. android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, null);
    8. mContext.registerReceiver(mFinishReceiver, new IntentFilter(ACTION_FINISH_WIZARD),
    9. android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, null);
    10. /// START. 弹SD卡后图标不消失. By XShawn@20210203.
    11. mContext.registerReceiver(
    12. mServiceResetReceiver,
    13. new IntentFilter(ACTION_RESET_STORAGE_SERVICE)
    14. );
    15. /// END. 弹SD卡后图标不消失. By XShawn@20210203.
    16. // Kick current state into place
    17. final List<DiskInfo> disks = mStorageManager.getDisks();
    18. for (DiskInfo disk : disks) {
    19. onDiskScannedInternal(disk, disk.volumeCount);
    20. }
    21. final List<VolumeInfo> vols = mStorageManager.getVolumes();
    22. for (VolumeInfo vol : vols) {
    23. onVolumeStateChangedInternal(vol);
    24. }
    25. mContext.getPackageManager().registerMoveCallback(mMoveCallback, new Handler());
    26. updateMissingPrivateVolumes();
    27. }

    记录最后一次的存储设备情况