若您在此注册语雀,可以让我记录更多内容。
移除正在使用中的存储设备,在任何操作系统上都是非法操作,都会引发一定程度的故障,甚至系统宕机(极端情况下会引发SWT)。而存储设备轻则文件被损坏,重则硬件烧坏,这是无法彻底解决的,只能在人为习惯上尽量避免。
本题即为播放T卡中的视频时,突然被拔出,导致ExternalStorageService的IO操作被挂起,StorageService检测到挂起状态后对其进行重启。
ExternalStorageService 重启之后重新尝试卸载T卡,而此时T卡实际已经不在了,故卸载失败;因而SystemUI收不到卸载完成的通知,故图标不消失。
针对此现象的修改方法如下:
1、
修改 vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/StorageNotification.java
private NotificationManager mNotificationManager;private StorageManager mStorageManager;/// START. 弹SD卡后图标不消失. By XShawn@20210203.private static final String ACTION_RESET_STORAGE_SERVICE = "emdoor.intent.action.RESET_STORAGE_SERVICE";private VolumeInfo lastPublicVolume = null;private final BroadcastReceiver mServiceResetReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String sessionId = intent.getStringExtra("SESSION_ID");String volId = lastPublicVolume.getId();if (null == lastPublicVolume || !volId.equals(sessionId)) {return;}mNotificationManager.cancelAsUser(volId, SystemMessage.NOTE_STORAGE_PUBLIC,UserHandle.of(lastPublicVolume.getMountUserId()));lastPublicVolume = null;}};/// END. 弹SD卡后图标不消失. By XShawn@20210203.public StorageNotification(Context context) {super(context);}
注册广播
@Overridepublic void start() {mNotificationManager = mContext.getSystemService(NotificationManager.class);mStorageManager = mContext.getSystemService(StorageManager.class);mStorageManager.registerListener(mListener);mContext.registerReceiver(mSnoozeReceiver, new IntentFilter(ACTION_SNOOZE_VOLUME),android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, null);mContext.registerReceiver(mFinishReceiver, new IntentFilter(ACTION_FINISH_WIZARD),android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, null);/// START. 弹SD卡后图标不消失. By XShawn@20210203.mContext.registerReceiver(mServiceResetReceiver,new IntentFilter(ACTION_RESET_STORAGE_SERVICE));/// END. 弹SD卡后图标不消失. By XShawn@20210203.// Kick current state into placefinal List<DiskInfo> disks = mStorageManager.getDisks();for (DiskInfo disk : disks) {onDiskScannedInternal(disk, disk.volumeCount);}final List<VolumeInfo> vols = mStorageManager.getVolumes();for (VolumeInfo vol : vols) {onVolumeStateChangedInternal(vol);}mContext.getPackageManager().registerMoveCallback(mMoveCallback, new Handler());updateMissingPrivateVolumes();}
记录最后一次的存储设备情况
