|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
又盲看一些关于Objective-C的一些语法基础和规则。之前有一定的C和C++还有Java的基础,所以看起来还是不会很吃力的,各种语言的思想相差还是不会很大的。这篇文章从体系源代码剖析,报告怎样将程序创立的多媒体文件到场体系的媒体库,怎样从媒体库删除,和年夜多半程序开辟者常常碰到的没法增加到媒体库的成绩等。自己将经由过程对源代码的剖析,逐一注释这些成绩。
Android中的多媒体文件扫描机制
Android供应了一个很棒的程序来处置将多媒体文件到场的媒体库中。这个程序就是MediaProvider,如今我们复杂看以下这个程序。起首看一下它的Receiver
- 1234567891011121314151617
复制代码- <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的部分。
- <serviceandroid:name="MediaScannerService"android:exported="true"><intent-filter><actionandroid:name="android.media.IMediaScannerService"/></intent-filter></service>
复制代码
MediaScannerService中的scanFile办法
- privateUriscanFile(Stringpath,StringmimeType){StringvolumeName=MediaProvider.EXTERNAL_VOLUME;openDatabase(volumeName);MediaScannerscanner=createMediaScanner();returnscanner.scanSingleFile(path,volumeName,mimeType);}
复制代码
MediaScannerService中的scan办法
- 123456789101112131415161718192021222324252627
复制代码- 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办法
- 123456789101112131415161718
复制代码- 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便可。
- <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
复制代码- <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
- <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
复制代码- <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代码。
- <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
复制代码- <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+"/"),这里我举一个复杂的小例子。
- <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
复制代码- <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
复制代码
我们看一下输入日记,剖析缘故原由。
- <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
复制代码- <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/开首。以是扫描操纵没有入手下手,招致文件没有到场到媒体库。以是,请反省文件的路径。
以后的学习中,一定要多问自己几个为什么,多向有经验的人请教,不要碍于面子。我看重苹果未来的发展,所以我一定要坚持下去,也许别人很容易就学会了的工具,我要学很久,但没关系,因为我始终相信勤能补拙这句话! |
|