当图片在compress()保存之后,使用gallery去查看的时候,发现刚才保存的图片不存在。
这种情况下,需要使用 MediaScannerConnection 去通知系统扫描到多媒体数据库
MediaScannerConnection.MediaScannerConnectionClient client = new MediaScannerConnectionClient(){
//MediaScannerConnection mediaScannerConnection = mConnectionMap.get(MEDIA_CONNECT_KEY);
// -------千万不要写在这里 初始化顺利的原因 mediaScannerConnection是null 会出现系统错误提示,也不能达到扫描的目的
@Override
public void onMediaScannerConnected() {
MediaScannerConnection mediaScannerConnection = mConnectionMap.get(MEDIA_CONNECT_KEY);
// 注意这里
if(DEBUG) Log.i(TAG,"onMedia Connected~~~~~~~~~~~");
if(mediaScannerConnection != null)
mediaScannerConnection.scanFile(file.toString(),null);
else {
if(DEBUG) Log.i(TAG,"NUll point");
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
MediaScannerConnection mediaScannerConnection = mConnectionMap.get(MEDIA_CONNECT_KEY);
if(mediaScannerConnection != null) mediaScannerConnection.disconnect();
if(DEBUG) Log.i(TAG,"connect is over~~~~~~`");
}
};
MediaScannerConnection mediaScannerConnection = new MediaScannerConnection(this,client);
mConnectionMap.put(MEDIA_CONNECT_KEY, mediaScannerConnection);
mediaScannerConnection.connect();
特别注意,可以出现 has leaked ServiceConnection android.media.MediaScannerConnecti 类似的系统错误提示,原因是mediaScannerConnection是null
onScanCompleted()不能被调用,activity就结束。
但是调用MediaScannerConnection之后,在gallery 仍然没有看到最近保存的图片,原因在于gallery,并不是时时update的,需要重启gallery甚至是关机才能搞定。
这样很麻烦,在网上还有另一种方式
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.toString())));
这种方式只能扫描具体文件,不能扫描文件夹,重要的是通过尝试,其效果与 MediaScannerConnection 方式差不多
必杀技:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
这种方式扫描系统默认路徑下的文件夹
sendBroadcast 这样的系统广播,最好不要随便发,会带来意想不到的问题,推荐使用 MediaScannerConnection
sendBroadcast 详细分析,看以下这篇文章:
http://www.iteye.com/topic/697492
最近好懒,要多写写阿~~~~~~~~
分享到:
相关推荐
Android系统中的MediaProvider和MediaScanner是两个与媒体文件管理紧密相关的组件。MediaProvider是Android系统中用于管理媒体文件的Content Provider,而MediaScanner则是与之协同工作的一个后台服务,它负责扫描...
在Android系统中,Mediascanner是一个至关重要的组件,它负责扫描设备上的媒体文件(如图片、音频和视频),并将这些文件的信息添加到媒体数据库中,以便用户可以在图库、音乐播放器等应用中访问它们。这个过程被...
Android MediaScanner 是Android系统中用于媒体文件管理和索引的服务。它是Android平台多媒体框架的一个组成部分,负责扫描设备上的媒体文件,并将相关信息更新到媒体数据库中,以便其他应用程序(如音乐播放器、...
MediaScanner 源代码分析。我从网上搜集的关于MediaScanner 的源代码分析资料。欢迎大家下载学习
在Android系统中,`MediaScanner`是一个至关重要的组件,它负责扫描设备上的媒体文件(如音乐、图片和视频),并将这些文件的信息添加到系统的媒体库。这个过程是自动进行的,当新文件被添加到设备时,`MediaScanner...
Android 媒体库框架(MediaScanner) Android 媒体库框架(MediaScanner)是 Android 平台上的一种媒体文件管理机制,旨在提供一个统一的媒体文件管理方式,帮助用户快速地浏览和管理媒体文件。 媒体文件管理机制 ...
1. **初始化**:在Java层进行,MediaScanner根据存储路径(内部卷或外部卷)打开对应的SQLite数据库,这些数据库用于存储媒体文件信息。 2. **预扫描**:清除旧的文件和播放列表缓存,然后根据MediaProvider的请求...
2.2 学习JNI的实例:MediaScanner 2.3 Java层的MediaScanner分析 2.3.1 加载JNI库 2.3.2 Java的native函数和总结 2.4 JNI层MediaScanner的分析 2.4.1 注册JNI函数 2.4.2 数据类型转换 2.4.3 JNIEnv介绍 2.4.4 通过...
第2章通过对android系统中的mediascanner进行分析,详细讲解了 android中十分重要的jni技术;第3章分析了init进程,揭示了通过解析init.rc来启动zygote以及属性服务的工作原理;第4章分析了zygote、systemserver等...
- MediaScanner负责扫描两个主要的目录:内部卷(指向$ANDROID_ROOT/media)和外部卷(指向$EXTERNAL_STORAGE)。 - 在Java层进行初始化,打开与内部卷和外部卷对应的数据库连接。 - Java层的预扫描阶段,会清除...
mediaScanner.Call("scanFile", filePath, null, new OnScanCompletedListener()); } ``` 最后,确保在使用完Java对象后释放资源,避免内存泄漏: ```csharp mediaScanner.Call("unregisterReceiver"); ...
它调用MediaScanner类,该类负责扫描内部卷($(ANDROID_ROOT)/media)和外部卷($(EXTERNAL_STORAGE))中的文件。 3. **JAVA层初始化**: 在初始化阶段,MediaScanner会根据文件所在的卷(内部或外部)打开对应的...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...
2.2 学习JNI的实例:MediaScanner / 15 2.3 Java层的MediaScanner分析 / 16 2.3.1 加载JNI库 / 16 2.3.2 Java的native函数和总结 / 17 2.4 JNI层MediaScanner的分析 / 17 2.4.1 注册JNI函数 / 18 2.4.2 数据类型转换...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...
3. **多媒体扫描(MediaScanner)**:Android系统有一个名为MediaScanner的服务,用于扫描设备上的新添加或修改的媒体文件,并更新数据库。源码中会包含MediaScanner的相关逻辑,展示如何扫描文件并更新媒体信息。 ...
第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等...