我有以下设置:
SD卡安装接收器(MountReceiver.java)
public IntentFilter getIntentFilter() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addDataScheme("file");
return intentFilter;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
setMounted(true);
} else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
setMounted(false);
}
}
private void setMounted(boolean isMounted) {
if (isMounted) {
doPerformQuery();
}
}
当我注册接收器时,我会这样做:
registerReceiver(mountInstance, mountInstance.getIntentFilter());
一切都很好,花花公子并按预期工作。我可以卸载并重新安装我的SD卡,并且我的setMounted方法会被触发。我遇到的问题是,我的doPerformQuery()方法在安装SD卡后返回0结果。如果我将代码更改为:
Thread.sleep(5000);
doPerformQuery();
然后它偶尔会起作用。这使SD卡完成“准备”5秒钟。我想知道SD卡何时完成准备并且可以阅读。目前,我已经获得了SD卡安装时的意图,但它还没有“准备好”,所以它不可读。是否有这样的意图在SD卡完成“准备”时注册。在旁注中,我说“准备”,因为这是我的电话在通知栏中所说的。我不确定这是否是所有手机的标准配置,因为我无法找到关于在线准备SD卡的一件事。
答案 0 :(得分:2)
回应我们对您原始问题的评论......
我认为逻辑是,当SD卡被卸下时,各种AV媒体(视频,音乐,照片等)的内容提供商将被清除SD卡上的任何内容,因为系统将不知道何时(如果有的话) )相同的SD卡将返回,如果它确实是否会有相同的文件。因此,每次安装SD卡时都会执行完整扫描(导致“准备”通知)。
因此,在您的情况下,检查ACTION_MEDIA_SCANNER_STARTED,最重要的是关联的ACTION_MEDIA_SCANNER_FINISHED意味着AV媒体内容提供商将拥有卡上所有内容的最新列表。
答案 1 :(得分:0)
检查Environment.getExternalStorageState()
结果(link to API)。
我很确定你会在几秒钟之后得到MEDIA_CHECKING
。如果这是正确的,您可以使用简单的while
循环进行检查,并在状态更改为MEDIA_MOUNTED