c 扫描sd卡卡有什么作用

Android&多媒体SD卡扫描(Android&Media&Scanner&Process)
&下面是系统图:&
MediaScannerReceiver 会在任何的 ACTION_BOOT_COMPLETED,
ACTION_MEDIA_MOUNTED 或ACTION_MEDIA_SCANNER_SCAN_FILE 意图( intent
)发出的时候启动。因为解析媒体文件 的元数据 或许会需要很长时间 ,所以MediaScannerReceiver 会启动
MediaScannerService 。&
MediaScannerService 调用一个公用类 MediaScanner 去处理真正的工作。
MediaScannerReceiver 维持两种扫描目录:一种是内部卷(internal volume )指向
$(ANDROID_ROOT)/media. 另一种是外部卷( external volume )指向
$(EXTERNAL_STORAGE).&
扫描和解析工作位于 JAVA 层和 C++ 层。 JAVA 层是启动器。 MediaScanner
扫描所有目录,如下步骤:&
1.JAVA 层初始化&
在这一步骤中,它会根据目录是在内部卷还是外部卷打开不同的数据库 。&
首先清除文件和播放 列表的缓存条目。然后根据 MediaProvider
返回的请求结果生成新文件和播放列表缓存条目。&
3.C++ 层处理目录&
列举出所有文件和特定的所有子目录(如果子目录包含一个 .nomedia
隐藏文件,则不会被列举出来。)。被列举的文件是根据文件扩展来判断文件是否被支持。如果支持这种文件扩展, C++ 层就会回调到 JAVA
层扫描文件。这种扩展就会被扫描到 MediaFile.java 中列出。下面是支持的文件扩展列表。
addFileType("MP3", FILE_TYPE_MP3,
"audio/mpeg");&
addFileType("M4A", FILE_TYPE_M4A,
"audio/mp4");&
addFileType("WAV", FILE_TYPE_WAV,
"audio/x-wav");&
addFileType("AMR", FILE_TYPE_AMR,
"audio/amr");&
addFileType("AWB", FILE_TYPE_AWB,
"audio/amr-wb");&
addFileType("WMA", FILE_TYPE_WMA,
"audio/x-ms-wma");&
addFileType("OGG", FILE_TYPE_OGG,
"application/ogg");&
addFileType("MID", FILE_TYPE_MID,
"audio/midi");&
addFileType("XMF", FILE_TYPE_MID,
"audio/midi");&
addFileType("RTTTL", FILE_TYPE_MID,
"audio/midi");&
addFileType("SMF", FILE_TYPE_SMF,
"audio/sp-midi");&
addFileType("IMY", FILE_TYPE_IMY,
"audio/imelody");&
addFileType("MP4", FILE_TYPE_MP4,
"video/mp4");&
addFileType("M4V", FILE_TYPE_M4V,
"video/mp4");&
addFileType("3GP", FILE_TYPE_3GPP,
"video/3gpp");&
addFileType("3GPP", FILE_TYPE_3GPP,
"video/3gpp");&
addFileType("3G2", FILE_TYPE_3GPP2,
"video/3gpp2");&
addFileType("3GPP2", FILE_TYPE_3GPP2,
"video/3gpp2");&
addFileType("WMV", FILE_TYPE_WMV,
"video/x-ms-wmv");&
addFileType("JPG", FILE_TYPE_JPEG,
"image/jpeg");&
addFileType("JPEG", FILE_TYPE_JPEG,
"image/jpeg");&
addFileType("GIF", FILE_TYPE_GIF,
"image/gif");&
addFileType("PNG", FILE_TYPE_PNG,
"image/png");&
addFileType("BMP", FILE_TYPE_BMP,
"image/x-ms-bmp");&
addFileType("WBMP", FILE_TYPE_WBMP,
"image/vnd.wap.wbmp");&
addFileType("M3U", FILE_TYPE_M3U,
"audio/x-mpegurl");&
addFileType("PLS", FILE_TYPE_PLS,
"audio/x-scpls");&
addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl");
4.Java 层扫描文件
& a ) Java 层开始文件
首先它忽略一些 MacOS 和
Windows Media Player
特殊的文件。然后它会查看被扫描的文件是否已经存在于缓存条目中,如果存在,它会检查文件上次修改的时间是否改变。最后它返回该文件是否需要进一步处理的结果。如果不需要,接下来的两步不会执行。
& b)C++ 层扫描文件
不是所有的文件都需要交给 C++
层解析成元数据。只有下面的文件类型会被解析,注意,这里不处理 image 文件。
if (mFileType == MediaFile.FILE_TYPE_MP3
mFileType == MediaFile.FILE_TYPE_MP4 ||&
mFileType == MediaFile.FILE_TYPE_M4A ||&
mFileType == MediaFile.FILE_TYPE_3GPP
mFileType == MediaFile.FILE_TYPE_3GPP2
mFileType == MediaFile.FILE_TYPE_OGG ||&
mFileType == MediaFile.FILE_TYPE_MID ||&
mFileType == MediaFile.FILE_TYPE_WMA) {&
对于被解析的元数据信息, C++
层会回调到 JAVA 层的 handleStringTag 。 Java 层会记录它的 name/value 信息。
& c)Java 层结束文件
&最后根据上一步解析出的值, Java 层会更新相应的 MeidaProvider
产生的数据库表。
5.Java 层发送扫描
到目前为止,所有文件已经被扫描,它最后会检查文件和播放列表缓存条目,看是否所有项仍然存在于文件系统。如果有空条目,则会从数据库中删除。这样它能够保持数据库和文件系统的一致性。
& 其他的应用 程序 通过接收 MediaScannerService 发出的
ACTION_MEDIA_SCANNER_STARTED 和ACTION_MEDIA_SCANNER_FINISHED
意图能够知道什么时候扫描操作开始和结束。
MediaScanner
之所以拿MediaScanner开刀
因为想借用系统的Media Scan
工具&&通过Intent直接调用系统的
1. 下载并安装Git 过程略
网络上很多
得到该功能的模块地址并使用Git下载之&
&地址:git://.git.kernel.org/platform/packages/providers/MediaProvider.git
3.&&分析源代码:
-&Manifest.xml
:&&各组件属性描述文件
- MediaProvider :
ContentProvider&&使用SQLiteDatabase
保存查询数据 action="content://media"
MediaScannerCursor.java
MediaScannerReceiver : extends BroadcastReceiver&
&用于接收指定Broadcast: BOOT_COMPLETED MEDIA_MOUNTED
MEDIA_SCANNER_SCAN_FILE 并启动 MediaScannerService 开始扫描
MediaScannerService : extends Service&
&执行具体的扫描工作
MediaThumbRequest
并不打算自行实现多媒体扫描 因此 此次重点研究对象:MediaScannerReceiver
MediaScannerReceiver 代码
&class&&MediaScannerReceiver&&extends&&BroadcastReceiver&&
& & private&
&static&&String
TAG =&&"MediaScannerReceiver"
& & @Override&
& & public&
&void&&onReceive(Context
context, Intent intent)
&&&String action
= intent.getAction();&&
&&&Uri uri =
intent.getData();&&
externalStoragePath =
Environment.getExternalStorageDirectory().getPath();&&
&&&if&&(action.equals(Intent.ACTION_BOOT_COMPLETED))
&& &// scan
internal storage& &
&scan(context,
MediaProvider.INTERNAL_VOLUME);&&
&if&&(uri.getScheme().equals(
"file" )) {&&
&& & // handle
intents related to external storage&
&& & String path
= uri.getPath();&&
if&&(action.equals(Intent.ACTION_MEDIA_MOUNTED)
&externalStoragePath.equals(path))
&&&scan(context,
MediaProvider.EXTERNAL_VOLUME);&&
&if&&(action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
&& &path !=
path.startsWith(externalStoragePath
&&&scanFile(context,
& & private&
&void&&scan(Context
context, String volume)
&&&Bundle args =
new&&Bundle();&&
&&&args.putString("volume"
, volume);&&
&&&context.startService(&&
new&&Intent(context,
MediaScannerService. class
).putExtras(args));&&
& & private&
&void&&scanFile(Context
context, String path)
&&&Bundle args =
new&&Bundle();&&
&&&args.putString("filepath"
, path);&&
&&&context.startService(&&
new&&Intent(context,
MediaScannerService. class
).putExtras(args));&&
public class MediaScannerReceiver extends
BroadcastReceiver
& & private final static String
TAG = "MediaScannerReceiver";
& & @Override
& & public void onReceive(Context
context, Intent intent) {
&&&String action
= intent.getAction();
&&&Uri uri =
intent.getData();
externalStoragePath =
Environment.getExternalStorageDirectory().getPath();
(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
&& &// scan
internal storage
&scan(context,
MediaProvider.INTERNAL_VOLUME);
(uri.getScheme().equals("file")) {
&& & // handle
intents related to external storage
&& & String path
= uri.getPath();
(action.equals(Intent.ACTION_MEDIA_MOUNTED)
&externalStoragePath.equals(path)) {
&&&scan(context,
MediaProvider.EXTERNAL_VOLUME);
&& & } else if
(action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
&& &path != null
path.startsWith(externalStoragePath + "/")) {
&&&scanFile(context,
& & private void scan(Context
context, String volume) {
&&&Bundle args =
new Bundle();
&&&args.putString("volume",
&&&context.startService(
Intent(context,
MediaScannerService.class).putExtras(args));
& & private void scanFile(Context
context, String path) {
&&&Bundle args =
new Bundle();
&&&args.putString("filepath",
&&&context.startService(
Intent(context,
MediaScannerService.class).putExtras(args));
6.& &根据以上代码得知:
-&&当系统启动完毕 会扫描一次
-&&当 ACTION_MEDIA_MOUNTED
ACTION_MEDIA_SCANNER_SCAN_FILE 也会扫描
7.&&如何调用系统MediaScanner 进行扫描
Intent.ACTION_MEDIA_MOUNTED 进行全扫描
&void&&allScan(){&&
&&&sendBroadcast(new&&Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse( "file://"& &
Environment.getExternalStorageDirectory())));&&
public void allScan(){
&sendBroadcast(new
Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
Environment.getExternalStorageDirectory())));
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 扫描某个文件
&void&&fileScan(String
&&&Uri data =
Uri.parse("file:///"
+fName);&&
&&&sendBroadcast(new&&Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
public void fileScan(String fName){
&& &Uri data =
Uri.parse("file:///"+fName);
&sendBroadcast(new
Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));
补充: 上述方法是不支持对文件夹的
即:Uri data 必须是 文件的Uri&&如果是文件夹的
其不会起作用的 切记!
- 如何扫描某文件夹下所有文件
难道就不可以么? 当然不 借助于Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
我们可以这么做:
取出该文件夹下的所有子文件 如其是文件且类型符合条件 就取出该文件目录 以
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE方式发送至MediaScannerReceiver&
&若其为文件夹 则迭代查询之&
& 故实现为:
&void&&fileScan(String
&&&Uri data =
Uri.parse("file://"
&&&Log.d("TAG" ,
"file:" +file);&&
&&&sendBroadcast(new&&Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
& & public&
&void&&folderScan(String
&&&File file =
new&&File(path);&&
(file.isDirectory()){&&
&& &File[] array
= file.listFiles();&&
;i&array.i++){&&
&& & File f =
array[i];&&
(f.isFile()){ //FILE TYPE&
&&&String name =
f.getName();&&
(name.contains( ".mp3"
&fileScan(f.getAbsolutePath());&&
else&&{ //FOLDER
&&&folderScan(f.getAbsolutePath());&&
public void fileScan(String file){
&& &Uri data =
Uri.parse("file://"+file);
&Log.d("TAG","file:"+file);
&sendBroadcast(new
Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));
& & public void folderScan(String
&& &File file =
new File(path);
&if(file.isDirectory()){
&&&File[] array
= file.listFiles();
&&&for(int
i=0;i&array.i++){
&& & File f =
if(f.isFile()){//FILE TYPE
&& &String name
= f.getName();
&if(name.contains(".mp3")){
&&&fileScan(f.getAbsolutePath());
{//FOLDER TYPE
&folderScan(f.getAbsolutePath());
8. 鉴于多数人并不关心其原理
仅关系如何使用 故 总结如下:
-& &扫描全部 我猜测其在效率方面可能有点副作用
&void&&systemScan(){&&
&&&sendBroadcast(new&&Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse( "file://"& &
Environment.getExternalStorageDirectory())));&&
public void
systemScan(){&&
&&&sendBroadcast(new
Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"&&
Environment.getExternalStorageDirectory())));&&
扫描某个文件&&参数:填入该文件的路径
&void&&fileScan(String
&&&Uri data =
Uri.parse("file://"
&&&sendBroadcast(new&&Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
public void fileScan(String
&&&Uri data =
Uri.parse("file://"+file);&&
&&&sendBroadcast(new
Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
扫描文件夹
参数:填入该文件夹路径
&void&&fileScan(String
&&&Uri data =
Uri.parse("file://"
&&&sendBroadcast(new&&Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
& & public&
&void&&folderScan(String
&&&File file =
new&&File(path);&&
(file.isDirectory()){&&
&& &File[] array
= file.listFiles();&&
;i&array.i++){&&
&& & File f =
array[i];&&
(f.isFile()){ //FILE TYPE&
&&&String name =
f.getName();&&
(name.contains( ".mp3"
&fileScan(f.getAbsolutePath());&&
else&&{ //FOLDER
&&&folderScan(f.getAbsolutePath());&&
public void fileScan(String file){
& & & Uri data =
Uri.parse("file://"+file);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
& & public void folderScan(String
& & & File file
= new File(path);
if(file.isDirectory()){
& File[] array = file.listFiles();
i=0;i&array.i++){
& & File f = array[i];
& & if(f.isFile()){//FILE
& & & String
name = f.getName();
if(name.contains(".mp3")){
& fileScan(f.getAbsolutePath());
& & else {//FOLDER TYPE
folderScan(f.getAbsolutePath());
原文来自:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。用法超简单 直接存入SD卡的胶片数码扫描仪
发表时间:
来源:DC.watch
作者: 编译
责任编辑: kiwi
  在拍摄完胶片后,大家在冲印的时候都会扫底,让其数码化方便保存和修改。但是对于一些喜欢自己手冲的玩家,要再出去扫底就有些不值当了。近日,日本一家公司就推出了家用胶片数码扫描仪,它最大的特点就是直接可以存入SD存储卡。
  这款胶片数码扫描仪由Kenko公司发布,型号为KFS - 1420 BF,其搭载了1/2.3英寸1462万像素传感器,扫描分辨率为1340dpi,光源采用白色LED。外形尺寸约173&156&127。重量约590。它可以针对120胶卷进行扫描,对应的胶卷尺寸为6&9、6&7、6&6、6&4。只要是相应尺寸,无论是彩色还是黑白的底片都可以扫描。
  扫描仪经过扫描后可以直接存储SDHC/SD存储卡,保存的格式为JPEG。如果大家不像直接存储SD卡中,也可以通过USB直接连接电脑。目前,KFS - 1420 BF已经在日本店铺上市,售价约为18000日元左右(约合人民币1008元)。
周关注度:8241
周关注度:6989
周关注度:6326
周关注度:6241
周关注度:6879
周关注度:6573
周关注度:6541
周关注度:6357平板/笔记本
音乐播放器扫描不出来sd卡中的音乐
&登堂入室&
来自:浏览器
因为Android4.4的原因,第三方软件下载的东西放到SD卡时只能放到Android这个文件夹里,所以酷狗等软件下载的歌都在这个文件夹里,而华为音乐播放器扫描不到Android文件夹里的音乐。但是酷狗可以,希望解决一下。
width:100%">
&登堂入室&
来自:浏览器
下载的在Android/dat/各自软件里,我手机里有酷狗,有网易云音乐,它两互相能扫描到歌曲,华为音乐一个都扫描不到
width:100%">
&新学乍练&
来自:浏览器
对的,怎么添加文件夹
width:100%">
&新学乍练&
来自:浏览器
即使在华为音乐里下完后,也扫不出来
width:100%">
&渐入佳境&
来自:浏览器
可以啊,我的自己就扫了
width:100%">
【北京宽沟】【谧静之美】【秋叶静美】【星海广场】【一组随拍】【行摄泉州】
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
没有最新动态
关注花粉俱乐部
联系我们:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利TF卡和SD卡有区别吗?可以放手机上用吗?
噼里啪啦碰鳖24
简单的讲,就是这俩种卡都有U盘一样的功能,存东西的..区别在于TF小,SD大一点,目前手机都是用TF卡的.
为您推荐:
其他类似问题
没有区别,就是一种卡的两种叫法,可以放到手机上用。
手机上只可以放SD卡
TF卡是什么?SD卡是内存卡啊
扫描下载二维码Android开发(36)
initData(){
&&& File root = File(&/mnt/sdcard&);
&&& (root.exists())
&&&&&&& currentParent =
&&&&&&& currentFiles = root.listFiles();
&&&&&&& inflateListView(currentFiles);
&&& videoListView2.setOnItemClickListener(AdapterView.OnItemClickListener()
&&&&&&& @Override
&&&&&&& onItemClick(AdapterView&?& parent, View view,
position,id)
&&&&&&&&&&& (currentFiles[position].isFile())
&&&&&&&&&&& {
&&&&&&&&&&&&&&& String filepath = currentFiles[position].getAbsolutePath();
&&&&&&&&&&&&&&& Intent intent = Intent();
&&&&&&&&&&&&&&& intent.putExtra(&filepath&,filepath);
&&&&&&&&&&&&&&& intent.setClass($.getContext(), PlayActivity.);
&&&&&&&&&&&&&&& startActivity(intent);
&&&&&&&&&&& }
&&&&&&&&&&& File[] tmp = currentFiles[position].listFiles();
&&&&&&&&&&& (tmp == || tmp.length ==
&&&&&&&&&&& {
&&&&&&&&&&&&&&& // $.toast(&当前路径不可访问或该路径下没有文件&,0);
&&&&&&&&&&& }
&&&&&&&&&&& {
&&&&&&&&&&&&&&& currentParent =
currentFiles[position];
&&&&&&&&&&&&&&& currentFiles =
&&&&&&&&&&&&&&& inflateListView(currentFiles);
&&&&&&&&&&& }
&&& btn_parent.setOnClickListener(View.OnClickListener()
&&&&&&& @Override
&&&&&&& onClick(View v)
&&&&&&&&&&& {
&&&&&&&& &&&&&&&(!currentParent.getCanonicalPath().equals(&/mnt/sdcard/&))
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& currentParent =
currentParent.getParentFile();
&&&&&&&&&&&&&&&&&&& currentFiles =
currentParent.listFiles();
&&&&&&&&&&&&&&&&&&& inflateListView(currentFiles);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& } (IOException e)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&& }
inflateListView(File[] files)
&&& List&Map&String, Object&&listItems =
ArrayList&Map&String,Object&&();
&&& (i = 0; i & files.length; i++)
&&&&&&& Map&String, Object&listItem =
HashMap&String, Object&();
&&&&&&& (files[i].isDirectory())
&&&&&&&&&&& listItem.put(&icon&, R.drawable.folder);
&&&&&&&&&&& listItem.put(&icon&, R.drawable.file);
&&&&&&& listItem.put(&fileName&, files[i].getName());
&&&&&&& listItems.add(listItem);
&&& SimpleAdapter adapter = SimpleAdapter($.getContext(),listItems, R.layout.line,
String[]{&icon&,&fileName&},
[]{R.id.icon,R.id.file_name});
&&& videoListView2.setAdapter(adapter);
&&&&&&& tv_path2.setText(&当前路径:&+currentParent.getCanonicalPath());
&&&&&&& $.toast(tv_path2.getText().toString(),0);
&&&&& &&(tv_path2.getText().toString().equals(&当前路径:&+&/&)){
&&&&&&&&&&& btn_parent.setClickable();
&&&&&&&&&&& btn_parent.setText(&到达最顶级&);
&&&&&&& }{
&&&&&&&&&&& btn_parent.setClickable();
&&&&&&&&&&& btn_parent.setText(&返回上一级&);
&&& } (IOException e)
&&&&&&& e.printStackTrace();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2067次
排名:千里之外
原创:65篇

我要回帖

更多关于 wp10 sd卡扫描修复 的文章

 

随机推荐