若您在此注册语雀,可以让我记录更多内容。
移除正在使用中的存储设备,在任何操作系统上都是非法操作,都会引发一定程度的故障,甚至系统宕机(极端情况下会引发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() {
@Override
public 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);
}
注册广播
@Override
public 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 place
final 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();
}
记录最后一次的存储设备情况