在 Android 4.4 之后,ACTION_MEDIA_MOUNTED 这个广播只能由系统发出,APP 只能监听,不能广播,所以通过发送广播的方式来让系统扫描文件的做法已经是走不通了。在 4.4 以后,会因为权限不够抛出运行时异常
MediaScannerConnection
Android 认为,使用 MediaScannerConnection 会更加廉价,也就是系统的开销少。
1、如果是通过广播 ACTION_MEDIA_MOUNTED 的话,很多 APP 都会直接广播一个目录,于是系统就一直在扫描整个目录。而 MediaScannerConnection 每次只能扫描一个文件,这样的约束条件可能一定程度上能减少扫描的次数和个数。
2、 MediaScannerConnection 使用了比 ACTION_MEDIA_MOUNTED 更高效或更轻便的实现。
MediaScannerConnection 两种使用方式
1、创建MediaScannerConnection对象,调用scanFile() 方法。
public void scanFile(String path, String mimeType),
创建MediaScannerConnection对象的时候需要实现 MediaScannerConnection.MediaScannerConnectionClient接口,这个接口只有两个方法。在调用MediaScannerConnection.connect()方法后,MediaScannerConnectionClient接口的onMediaScannerConnected()方法会被回调,然后就可以调用 MediaScannerConnection.scanFile(String,String)方法了。在扫描完成后,MediaScannerConnectionClient的方法onScanCompleted(String path, Uri uri)会被回调,在这个方法里,一般调用MediaScannerConnection.disconnect()方法。
这个方法一次只能扫描一个文件,path 必须是一个具体的文件,不能是目录。在创建一个MediaScannerConnection对象后,如果要多次调用 scanFile() 方法,就不要在onScanCompleted() 方法里调用disconnect()方法。
2、使用 MediaScannerConnection.scanFile() 静态方法。
public static void scanFile(Context context, String[] paths, String[] mimeTypes, OnScanCompletedListener callback)
这是一个静态方法,使用就比较简单了。OnScanCompletedListener 可实现可不实现,它只有一个方法,在扫描完成的时候回调。scanFile 静态方法可以一次传递多个文件,如果 mimeTypes 不为空,就必须于 paths 的长度一致。mimeTypes 可以为空。
MimeType 的选择。
如果 MimeType ,将会使用文件的后缀名来判断文件的类型,但是千万别用
/
,我以为使用这个它会自动判断文件的类型的,结果不是这样子的。使用
/
的结果就是扫描完成后,相册里的东东全部没有出现在 MediaStore 里,也就是没有被当成多媒体文件扫描进多媒体数据库里。
package com.huahan.lovebook.utils;
import java.io.File;
import com.huahan.hhbaseutils.HHLog;
import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
public class MediaScanner {
private static final String TAG = "mtj";
private MediaScannerConnection mConn = null;
private SannerClient mClient = null;
private File mFile = null;
private String mMimeType = null;
public MediaScanner(Context context) {
if (mClient == null) {
mClient = new SannerClient();
if (mConn == null) {
mConn = new MediaScannerConnection(context, mClient);
class SannerClient implements
MediaScannerConnection.MediaScannerConnectionClient {
public void onMediaScannerConnected() {
if (mFile == null) {
return;
scan(mFile, mMimeType);
public void onScanCompleted(String path, Uri uri) {
mConn.disconnect();
private void scan(File file, String type) {
HHLog.i(TAG, "scan " + file.getAbsolutePath());
if (file.isFile()) {
mConn.scanFile(file.getAbsolutePath(), null);
return;
File[] files = file.listFiles();
if (files == null) {
return;
for (File f : file.listFiles()) {
scan(f, type);
public void scanFile(File file, String mimeType) {
mFile = file;
mMimeType = mimeType;
mConn.connect();
在 Android 4.4 之后,ACTION_MEDIA_MOUNTED 这个广播只能由系统发出,APP 只能监听,不能广播,所以通过发送广播的方式来让系统扫描文件的做法已经是走不通了。在 4.4 以后,会因为权限不够抛出运行时异常 MediaScannerConnection Android 认为,使用 MediaScannerConnection 会更加廉价,也就是系统的开销少。
1. 概述
MediaScanner 是 Android 多媒体系统中重要的一员,MediaScanner 与媒体文件预扫描相关。我们知道,Android 系统每次开机或者重新插拔 SD 卡之后都会去扫描系统存储空间中的媒体文件,并将媒体文件相关的信息存储到媒体数据库中。这样后续 Gallery、Music、VideoPlayer 等应用便可以直接查询媒体数据库,根据需要提取信息做显示。
如果进入...
当下App中二维码扫描、人脸扫描的场景越来越多,扫描的动画可以使用平移动画:TranslateAnimation
Demo中是使用TranslateAnimation实现一个人脸扫描的效果,上下来回滑动(二维码扫描同理),参考我的博客有详细描述,地址如下:
https://blog.csdn.net/u010231454/article/details/84986161
MediaScannerConnection
MediaScannerConnection 作用是为应用提供一个媒体扫描服务,当有新创建或者下载的文件时,会从该文件读取元数据并将该文件添加到媒体中去。
当我们添加一个文件的时候,我们需要刷新媒体库才能立即找得到添加文件,MediaScannerConnection可以为我们解决这一问题。
ACTION_MEDIA_MOUNTED 不能使...
String filePath = data.getStringExtra("path");
MediaMetadataRetriever media = new MediaMetadataRetriever();
media.setDataSource(filePath)
网上查了下android手机扫描内存或者SD卡里面的音频或者视频文件,进行显示。但是有些视频或者音频扫描不出来。有其中一个原因是当你添加了一个视频或者音频文件后,手机自身没有重新进行扫描。只有手机重启之后,手机自身才会进行扫描,才能使用传统的扫描方法扫描出视频、音频文件来。
所以可以自行添加一个扫描手机内存的方法,在扫描完之后,再使用传统的视频、音频文件获取方式获取来获取。
以下两个方法是用来启动
1. 扫描文件
在对文件进行重命名、删除等操作后需要 sendBroadcast通知MediaScanner去扫描文件,其中广播发送的Intent携带的action为:ACTION_MEDIA_SCANNER_SCAN_FILE。
MediaScannerConnection.scanFile(this,
new String[] {Environment.getExternalStorageDirectory().getAbsolutePath()},
MediaScannerService研究- https://blog.csdn.net/codefly/article/details/53177926
Android调用MediaScanner进行扫描- https://bashenmail.iteye.com/blog/603680
SD卡,MediaScannerService收到media_mount的action;手机存储卡,M...
MediaScannerConnection
MediaScannerConnection 作用是为应用提供一个媒体扫描服务,当有新创建或者下载的文件时,会从该文件读取元数据并将该文件添加到媒体中去。
当我们添加一个文件的时候,我们需要刷新媒体库才能立即找得到添加文件,MediaScannerConnection可以为我们解决这一问题。
那么我们就来看看怎么使用MediaScannerCon...
现在有个需求就是,查询SD卡里以”.txt”结尾的所有文档,我们第一反应是用for循环遍历SD卡文件,然后把所有以txt后缀名结尾的文件路径放到一个集合里,但是这样有个缺点,,太慢了,android已经为我们提供查询特定格式的文件的方法,速度很快。 /**
* 查询SD卡里可以上传的文档
private void queryFiles(){
2. 根据通信协议,选择相应的API或SDK进行开发,以实现与外接扫描设备的通信和数据传输。
3. 在Android应用程序中,通过使用Android的InputMethodManager类或者相应的API实现与外接扫描设备的交互。比如,您可以通过监听扫描设备的输入事件,将扫描到的信息传递到应用程序中进行处理。
总的来说,Android外接扫描设备的开发需要根据具体的情况进行选择和实现。如果您需要更详细的指导,可以提供更具体的信息,我会尽力给您提供更好的建议。