7.0是可以同步的,因为在挂载成功后会给MediaScannerReceiver发个更新媒体库的广播

如下

frameworks/base/services/core/java/com/android/server/MountService.java

                    break;                }                case H_VOLUME_BROADCAST: {                    final StorageVolume userVol = (StorageVolume) msg.obj;                    final String envState = userVol.getState();                    Slog.d(TAG, "Volume " + userVol.getId() + " broadcasting " + envState + " to "                            + userVol.getOwner());                    final String action = VolumeInfo.getBroadcastForEnvironment(envState);                    if (action != null) {                        final Intent intent = new Intent(action,                                Uri.fromFile(userVol.getPathFile()));                        intent.putExtra(StorageVolume.EXTRA_STORAGE_VOLUME, userVol);                        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);                        mContext.sendBroadcastAsUser(intent, userVol.getOwner());                    }                    break;                }

但是,android8.0就没有MountService.java这个文件,发广播的地方是在

frameworks/base/services/core/java/com/android/server/StorageManagerService.java

                case H_VOLUME_BROADCAST: {                    final StorageVolume userVol = (StorageVolume) msg.obj;                    final String envState = userVol.getState();                    Slog.d(TAG, "Volume " + userVol.getId() + " broadcasting " + envState + " to "                            + userVol.getOwner());                    final String action = VolumeInfo.getBroadcastForEnvironment(envState);                    if (action != null) {                        final Intent intent = new Intent(action,                                Uri.fromFile(userVol.getPathFile()));                        intent.putExtra(StorageVolume.EXTRA_STORAGE_VOLUME, userVol);                        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT                                | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);                        mContext.sendBroadcastAsUser(intent, userVol.getOwner());                    }                    break;                }
然后上面没有走到的原因是:
 (vol.isVisibleForRead(userId)为false

    if (!Objects.equals(oldStateEnv, newStateEnv)) {            // Kick state changed event towards all started users. Any users            // started after this point will trigger additional            // user-specific broadcasts.                        for (int userId : mSystemUnlockedUsers) {                Slog.w(TAG, "vol.isVisibleForRead(userId)-----"+vol.isVisibleForRead(userId));                 if (vol.isVisibleForRead(userId)) {                    final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, false);                    mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget();                    Slog.w(TAG, "mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget();");                     mCallbacks.notifyStorageStateChanged(userVol.getPath(), oldStateEnv,                            newStateEnv);                }            }        }
 然后影响
 (vol.isVisibleForRead(userId)为false是因为mountFlags为0
    public boolean isVisible() {        Slog.w(TAG, "isVisible-----"+mountFlags);         return (mountFlags & MOUNT_FLAG_VISIBLE) != 0;    }    private static final String TAG = "StorageManagerService";    public boolean isVisibleForRead(int userId) {        if (type == TYPE_PUBLIC) {            Slog.w(TAG, "isVisibleForRead11111111");             if (isPrimary() && mountUserId != userId) {                Slog.w(TAG, "isVisibleForRead1111_1111");                 // Primary physical is only visible to single user                return false;            } else {                Slog.w(TAG, "isVisibleForRead1111_2222");                 return isVisible();            }        } else if (type == TYPE_EMULATED) {            Slog.w(TAG, "isVisibleForRead222222");             return isVisible();        } else {            Slog.w(TAG, "isVisibleForRead33333");             return false;        }    }
然后mountFlags具体赋值的地方是

system/vold/CommandListener.cppint mountFlags = (argc > 3) ? atoi(argv[3]) : 0;userid_t mountUserId = (argc > 4) ? atoi(argv[4]) : -1;vol->setMountFlags(mountFlags);vol->setMountUserId(mountUserId);int res = vol->mount();if (mountFlags & android::vold::VolumeBase::MountFlags::kPrimary) {vm->setPrimary(vol);}







system/vold/CommandListener.cppint mountFlags = (argc > 3) ? atoi(argv[3]) : 0;userid_t mountUserId = (argc > 4) ? atoi(argv[4]) : -1;vol->setMountFlags(mountFlags);vol->setMountUserId(mountUserId);int res = vol->mount();if (mountFlags & android::vold::VolumeBase::MountFlags::kPrimary) {vm->setPrimary(vol);}


更多相关文章

  1. android 错误信息大整理
  2. Android(安卓)9.0 System.getProperty("java.library.path") 源
  3. Android下载文件常见错误解决方法
  4. Android(安卓)图片OutOfMemory异常bitmap size exceeds VM budge
  5. android 开发中遇到错误及解决办法总结
  6. Android(安卓)Studio打包APK是遇到的一些问题(Lint检查的错误)
  7. android ndk 给结构体赋值的方法
  8. Android(安卓)Canvas设置绘画时重叠部分的处理模式【含效果图】
  9. React-Native搭建报错:Unable to load script.Make sure you're e

随机推荐

  1. Android快速开发-选项卡
  2. Android下pm 命令详解
  3. android linux 基础知识总结
  4. Android:java.lang.SecurityException: P
  5. Android按钮事件响应顺序
  6. Android(安卓)P签名机制和系统权限
  7. Android成长之路-Android组件_EditView例
  8. 遇到的Android(安卓)eclipse 问题
  9. android.os.NetworkOnMainThreadExceptio
  10. Android(安卓)SDK开发包国内下载地址