仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1371|回复: 13
打印 上一主题 下一主题

[学习教程] IOS编程之Android扫描多媒体文件分析仓酷云

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:26:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
又盲看一些关于Objective-C的一些语法基础和规则。之前有一定的C和C++还有Java的基础,所以看起来还是不会很吃力的,各种语言的思想相差还是不会很大的。这篇文章从体系源代码剖析,报告怎样将程序创立的多媒体文件到场体系的媒体库,怎样从媒体库删除,和年夜多半程序开辟者常常碰到的没法增加到媒体库的成绩等。自己将经由过程对源代码的剖析,逐一注释这些成绩。
Android中的多媒体文件扫描机制

Android供应了一个很棒的程序来处置将多媒体文件到场的媒体库中。这个程序就是MediaProvider,如今我们复杂看以下这个程序。起首看一下它的Receiver
  1. 1234567891011121314151617
复制代码
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>
复制代码


MediaScannerReceiver只吸收切合action和数据划定规矩准确的intent。
MediaScannerReciever怎样处置Intent



  • 当且仅当吸收到actionandroid.intent.action.BOOT_COMPLETED才扫描外部存储(非内置和外置sdcard)
  • 除action为android.intent.action.BOOT_COMPLETED的之外的intent都必需要无数据传送。
  • 当收到Intent.ACTION_MEDIA_MOUNTEDintent,扫描Sdcard
  • 当收到Intent.ACTION_MEDIA_SCANNER_SCAN_FILEintent,检测没有成绩,将扫描单个文件。
MediaScannerService怎样事情

实践上MediaScannerReceiver并非真正处置扫描事情,它会启动一个叫做MediaScannerService的服务。我们持续看MediaProvider的manifest中关于service的部分。
  1. 12345
复制代码
  1. <serviceandroid:name="MediaScannerService"android:exported="true"><intent-filter><actionandroid:name="android.media.IMediaScannerService"/></intent-filter></service>
复制代码


MediaScannerService中的scanFile办法

  1. 123456
复制代码
  1. privateUriscanFile(Stringpath,StringmimeType){StringvolumeName=MediaProvider.EXTERNAL_VOLUME;openDatabase(volumeName);MediaScannerscanner=createMediaScanner();returnscanner.scanSingleFile(path,volumeName,mimeType);}
复制代码


MediaScannerService中的scan办法

  1. 123456789101112131415161718192021222324252627
复制代码
  1. privatevoidscan(String[]directories,StringvolumeName){//dontsleepwhilescanningmWakeLock.acquire();ContentValuesvalues=newContentValues();values.put(MediaStore.MEDIA_SCANNER_VOLUME,volumeName);UriscanUri=getContentResolver().insert(MediaStore.getMediaScannerUri(),values);Uriuri=Uri.parse("file://"+directories[0]);sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_STARTED,uri));try{if(volumeName.equals(MediaProvider.EXTERNAL_VOLUME)){openDatabase(volumeName);}MediaScannerscanner=createMediaScanner();scanner.scanDirectories(directories,volumeName);}catch(Exceptione){Log.e(TAG,"exceptioninMediaScanner.scan()",e);}getContentResolver().delete(scanUri,null,null);sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_FINISHED,uri));mWakeLock.release();}
复制代码


MediaScannerService中的createMediaScanner办法

  1. 123456789101112131415161718
复制代码
  1. privateMediaScannercreateMediaScanner(){MediaScannerscanner=newMediaScanner(this);Localelocale=getResources().getConfiguration().locale;if(locale!=null){Stringlanguage=locale.getLanguage();Stringcountry=locale.getCountry();StringlocaleString=null;if(language!=null){if(country!=null){scanner.setLocale(language+"_"+country);}else{scanner.setLocale(language);}}}returnscanner;}
复制代码


从下面能够发明,真正事情的实际上是android.media.MediaScanner.java详细扫描历程就请点击左边链接检察。
怎样扫描一个刚创立的文件

这里先容两种体例来完成将新创立的文件到场媒体库。
最复杂的体例

只必要发送一个准确的intent播送到MediaScannerReceiver便可。
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>0
复制代码
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>1
复制代码


下面的极简办法年夜多半情形下一般事情,可是有些情形下是不会事情的,稍后的部分会先容。即便你利用上述办法乐成了,仍是倡议你持续浏览稍后的为何发播送不乐成的部分。
利用MediaScannerConnection

  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>2
复制代码
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>3
复制代码


MediaScannerConnection的scanFile办法从2.2(API8)入手下手引进。
创立一个MediaScannerConnection对象然后挪用scanFile办法

很复杂,参考http://developer.android.com/reference/android/media/MediaScannerConnection.html
怎样扫描多个文件



  • 发送多个Intent.ACTION_MEDIA_SCANNER_SCAN_FILE播送
  • 利用MediaScannerConnection,传进要到场的路径的数组。
为何发送MEDIA_SCANNER_SCAN_FILE播送不失效

关于为何有些设备上不失效,良多人以为是API缘故原由,实在不是的,这实在和你传进的文件路径有干系。看一下吸收者Receiver的onReceive代码。
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>4
复制代码
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>5
复制代码


一切的部分都准确除传进的路径。由于你大概硬编码了文件路径。由于有一个如许的判别path.startsWith(externalStoragePath+"/"),这里我举一个复杂的小例子。
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>6
复制代码
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>7
复制代码


我们看一下输入日记,剖析缘故原由。
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>8
复制代码
  1. <receiverandroid:name="MediaScannerReceiver"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_MOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_UNMOUNTED"/><dataandroid:scheme="file"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE"/><dataandroid:scheme="file"/></intent-filter></receiver>9
复制代码


上述输入剖析,你发送的播送,action是准确的,数据划定规矩也是准确的,并且你的文件路径也是存在的,可是,文件的路径/sdcard/1390136305831_add.png并非之外部存储根路径/mnt/sdcard/开首。以是扫描操纵没有入手下手,招致文件没有到场到媒体库。以是,请反省文件的路径。

以后的学习中,一定要多问自己几个为什么,多向有经验的人请教,不要碍于面子。我看重苹果未来的发展,所以我一定要坚持下去,也许别人很容易就学会了的工具,我要学很久,但没关系,因为我始终相信勤能补拙这句话!
简单生活 该用户已被删除
沙发
发表于 2015-1-21 06:51:09 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
海妖 该用户已被删除
板凳
发表于 2015-1-30 10:12:35 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
蒙在股里 该用户已被删除
地板
发表于 2015-2-4 13:22:15 | 只看该作者
好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-5 11:54:02 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-9 22:52:17 | 只看该作者
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
柔情似水 该用户已被删除
7#
发表于 2015-2-10 05:19:38 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
深爱那片海 该用户已被删除
8#
发表于 2015-2-13 01:47:09 | 只看该作者
边吃零食边看Stanford的视频教程
小妖女 该用户已被删除
9#
发表于 2015-2-24 03:26:52 | 只看该作者
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
不帅 该用户已被删除
10#
发表于 2015-3-1 19:47:26 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
活着的死人 该用户已被删除
11#
发表于 2015-3-3 18:42:18 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
飘灵儿 该用户已被删除
12#
发表于 2015-3-11 12:24:19 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
若天明 该用户已被删除
13#
发表于 2015-3-18 10:44:01 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
小魔女 该用户已被删除
14#
发表于 2015-3-25 16:12:50 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表