




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android多媒体扫描过程(AndroidMediaScannerProcess卜面是系统图MediaScannerReceiver会在任何的ACTION_BOOT_COMPLETED,ACTION_MEDIA_MOUNTED或ACTION_MEDIA_SCANNER_SCAN_FIL意图(intent)发出的时候启动。因为解析媒体文件的元数据或许会需要很长时间,所以MediaScannerReceiver会启动MediaScannerService。MediaScannerService调用一个公用类MediaScanner去处理真正的工作。MediaScannerReceiver维持两种
2、扫描目录:一种是内部卷(internalvolume)指向$(ANDROID_ROOT)/media.另一种是外部卷(externalvolume)指向$(EXTERNAL_STORAGE).扫描和解析工作位于JAVA层和C+层。JAVA层是启动器。MediaScanner扫描所有目录,如下步骤:1 .JAVA层初始化在这一步骤中,它会根据目录是在内部卷还是外部卷打开不同的数据库。2 .Java层预扫描首先清除文件和播放列表的缓存条目。然后根据MediaProvider返回的请求结果生成新文件和播放列表缓存条目。3 .C+层处理目录列举出所有文件和特定的所有子目录(如果子目录包含一个.nome
3、dia隐藏文件,则不会被列举出来。)。被列举的文件是根据文件扩展来判断文件是否被支持。如果支持这种文件扩展,C+层就会回调到JAVA层扫描文件。这种扩展就会被扫描到MediaFile.java中列出。下面是支持的文件扩展列表。/*Audio*/addFileType("MP3",FILE_TYPE_MP3,"audio/mpeg");addFileType("M4A",FILE_TYPE_M4A,"audio/mp4");addFileType("WAV",FILE_TYPE_WAV,"
4、;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");addFil
5、eType("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&
6、quot;audio/imelody");/*Video*/addFileType("MP4",FILE_TYPE_MP4,"video/mp4");addFileType("M4V",FILE_TYPE_M4V,"video/mp4");addFileType("3GP",FILE_TYPE_3Gppvideo/3gpp");addFileType("3GPP",FILE_TYPE_3GPPvideo/3gpp");addFileType(&q
7、uot;3G2",FILE_TYPE_3GPP2,"videc3gpp2");addFileType("3GPP2",FILE_TYPE_3GPP2,"vide3gpp2");addFileType("WMV",FILE_TYPE_WMV,"video/x-ms-wmv");/*Image*/addFileType("JPG",FILE_TYPE_JPEG,"image/jpeg");addFileType("JPEG",FI
8、LE_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.w
9、bmp");/*AudioPlayList*/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和WindowsMediaPlayer
10、特殊的文件。然后它会查看被扫描的文件是否已经存在于缓存条目中,如果存在,它会检查文件上次修改的时间是否改变。最后它返回该文件是否需要进一步处理的结果。如果不需要,接下来的两步不会执行。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|mFileTy
11、pe=MediaFile.FILE_TYPE_3GPP2|mFileType=MediaFile.FILE_TYPE_OGG|mFileType=MediaFile.FILE_TYPE_MID|mFileType=MediaFile.FILE_TYPE_WMA)复制代码对于被解析的元数据信息,C+层会回调到JAVA层白hhandleStringTag。Java层会记录它的name/value信息。c)Java层结束文件最后根据上一步解析出的值,Java层会更新相应的MeidaProvider产生的数据库表。5 .Java层发送扫描到目前为止,所有文件已经被扫描,它最后会检查文件和播放列表缓存条
12、目,看是否所有项仍然存在于文件系统。如果有空条目,则会从数据库中删除。这样它能够保持数据库和文件系统的一致性。其他的应用程序通过接收MediaScannerService发出的ACTION_MEDIA_SCANNER_STARTE讶口ACTION_MEDIA_SCANNER_FINISHEDT图能够知道什么时候扫描操作开始和结束。MediaScanner之所以拿MediaScanner开刀因为想借用系统的MediaScan工具通过Intent直接调用系统的步骤1 .下载并安装Git过程略网络上很多2 .得到该功能的模块地址并使用Git下载之地址:git:android.git.kernel.o
13、rg/platform/packages/providers/MediaProvider.git3 .分析源代码:-AndroidManifest.xml:各组件属性描述文件-MediaProvider:extendsContentProvider使用SQLiteDatabase保存查询数据action="content:/media"-MediaScannerCursor.java-MediaScannerReceiver:extendsBroadcastReceiver用于接收指定Broadcast:BOOT_COMPLETEDMEDIA_MOUNTEDMEDIA_SC
14、ANNER_SCAN_FIL浒启动MediaScannerService开始扫描-MediaScannerService:extendsService执行具体的扫描工作-MediaThumbRequest4.鉴于并不打算自行实现多媒体扫描因此此次重点研究对象:MediaScannerReceiver5. MediaScannerReceiver代码Java代码1. publicclassMediaScannerReceiverextendsBroadcastReceiver2. (3. privatefinalstaticStringTAG="MediaScannerReceiver
15、"4.5. Override6. publicvoidonReceive(Contextcontext,Intentintent)7. Stringaction=intent.getAction();8. Uriuri=intent.getData();9. StringexternalStoragePath=Environment.getExternalStorageDirectory().getPath();10.11. if(action.equals(Intent.ACTION_BOOT_COMPLETED)12. /scaninternalstorage13. scan(c
16、ontext,MediaProvider.INTERNAL_VOLUME);14. else15. if(uri.getScheme().equals("file")16. /handleintentsrelatedtoexternalstorage17. Stringpath=uri.getPath();18. if(action.equals(Intent.ACTION_MEDIA_MOUNTED)&&19. externalStoragePath.equals(path)20. scan(context,MediaProvider.EXTERNAL_V
17、OLUME);21. elseif(action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)&&22. path!=null&&path.startsWith(externalStoragePath+"/")23. scanFile(context,path);24. 25. 26. 29. privatevoidscan(Contextcontext,Stringvolume)30. Bundleargs=newBundle();31. args.putString("volume&
18、quot;,volume);32. context.startService(33. newIntent(context,MediaScannerService.class).putExtras(args);34. 35.36. privatevoidscanFile(Contextcontext,Stringpath)37. Bundleargs=newBundle();38. args.putString("filepath",path);39. context.startService(40. newIntent(context,MediaScannerService
19、.class).putExtras(args);41. 42. 6 .根据以上代码得知:-当系统启动完毕会扫描一次-当ACTION_MEDIA_MOUNTEDACTION_MEDIA_SCANNER_SCAN_FILE也会扫描7 .如何调用系统MediaScanner进行扫描-通过Intent.ACTION_MEDIA_MOUNTED进行全扫描Java代码1. publicvoidallScan()2. sendBroadcast(newIntent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file:/"3. +Environment.
20、getExternalStorageDirectory();4. -通过Intent.ACTION_MEDIA_SCANNER_SCAN_FILE扫描某个文件Java代码1. publicvoidfileScan(StringfName)2. Uridata=Uri.parse("file:/"+fName);3. sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,data);4. 补充:上述方法是不支持对文件夹的即:Uridata必须是文件的Uri如果是文件夹的其不会起作用的切记!-如何扫描某文件夹
21、下所有文件难道就不可以么?当然不借助于Intent.ACTION_MEDIA_SCANNER_SCAN_FILE我们可以这么做:取出该文件夹下的所有子文件如其是文件且类型符合条件就取出该文件目录以Intent.ACTION_MEDIA_SCANNER_SCAN_FILE方式发送至MediaScannerReceiver若其为文件夹则迭代查询之故实现为:Java代码1. publicvoidfileScan(Stringfile)2. Uridata=Uri.parse("file:/"+file);3.4. Log.d("TAG","file:
22、"+file);5. sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,data);6. 7.8. publicvoidfolderScan(Stringpath)9. Filefile=newFile(path);10.11. if(file.isDirectory()12. Filearray=file.listFiles();13.14. for(inti=0;i<array.length;i+)15. Filef=arrayi;16.17. if(f.isFile()/FILETYPE18. St
23、ringname=f.getName();19.20. if(name.contains(".mp3")21. fileScan(f.getAbsolutePath();22. 23. 24. else/FOLDERTYPE25.folderScan(f.getAbsolutePath();26. 27. 28. 29. 8.鉴于多数人并不关心其原理仅关系如何使用故总结如下:-扫描全部我猜测其在效率方面可能有点副作用Java代码1.publicvoidsystemScan()2.sendBroadcast(newIntent(Intent.ACTION_MEDIA_MOUN
24、TED,Uri.parse("file:/"3.+Environment.getExternalStorageDirectory();4.扫描某个文件参数:填入该文件的路径Java代码1.publicvoidfileScan(Stringfile)2.Uridata=Uri.parse("file:/"+file);3.4.sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,data);5.-扫描文件夹参数:填入该文件夹路径Java代码1.publicvoidfileScan(Str
25、ingfile)2.Uridata=Uri.parse("file:/"+file);3.4.sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,data);7.publicvoidfolderScan(Stringpath)8. Filefile=newFile(path);9.10. if(file.isDirectory()11. Filearray=file.listFiles();12.13. for(inti=0;i<array.length;i+)14. Filef=arrayi;1
26、5.16. if(f.isFile()/FILETYPE17. Stringname=f.getName();18.19. if(name.contains(".mp3")20. fileScan(f.getAbsolutePath();21. 22. 23. else/FOLDERTYPE24. folderScan(f.getAbsolutePath();25. 26. 27. 28. 终于结束了看似简单的东西研究起来还是挺复杂的!AndroidMediaScannerMechanismAnalyzeArchitectureFigure2-1AsFigure2-1.Me
27、diaScannerReciverstartupatanytimewherereceiveintentACTION_BOOT_COMPLETED,ACTION_MEDIA_MOUNTEDorACTION_MEDIA_SCANNER_SCAN_FILE.Causeonthatspendlongtimetoprocessthemediametadata,sothatMediaScannerReceiverwillcallupMediaScannerService.MediaScannerServiceinvokeapublicclasswhichnamedMediaScannertodothesc
28、anwork,MediaScannerhandlethemediadatabasewithapublicclasswhichnamedMediaProviderMediaScannerReciversupporttwotypesofthefolder:1.internalvolume,pointto$(ANDROID_ROOT)/media.2.Externalvolume,point$(EXTERNAL_STORAGE).ScannerActionACTION_BOOT_COMPLETEDpublicstaticfinalStringACTION_BOOT_COMPLETEDBroadcas
29、tAction:Thisisbroadcastonce,afterthesystemhasfinishedbooting.Itcanbeusedtoperformapplication-specificinitialization,suchasinstallingalarms.YoumustholdtheRECEIVE_BOOT_COMPLETEDpermissioninordertoreceivethisbroadcast.Thisisaprotectedintentthatcanonlybesentbythesystem.ConstantValue:"ent
30、.action.BOOT_COMPLETED"ACTION_MEDIA_MOUNTEDpublicstaticfinalStringACTION_MEDIA_MOUNTEDBroadcastAction:Externalmediaispresentandmountedatitsmountpoint.ThepathtothemountpointfortheremovedmediaiscontainedintheIntent.mDatafield.TheIntentcontainsanextrawithname"read-only"andBooleanvaluetoi
31、ndicateifthemediawasmountedreadonly.ConstantValue:"ent.action.MEDIA_MOUNTED"ACTION_MEDIA_SCANNER_SCAN_FILE.publicstaticfinalStringACTION_MEDIA_SCANNER_SCAN_FILEBroadcastAction:Requestthemediascannertoscanafileandaddittothemediadatabase.ThepathtothefileiscontainedintheIntent.mDat
32、afield.ConstantValue:"ent.action.MEDIA_SCANNER_SCAN_FILE"AndroidMediaScannerReceiverWecanfindthesourcefilewithpathanydroid/packages/providers/MediaProvider/src/com/android/providers/media/MediaScannerReceiver.javapublicclassMediaScannerReceiverextendsBroadcastReceiverOverridepub
33、licvoidonReceive(Contextcontext,Intentintent)if(action.equals(Intent.ACTION_BOOT_COMPLETED)/scaninternalstoragescan(context,MediaProvider.INTERNAL_VOLUME);elseif(uri.getScheme().equals("file")/handleintentsrelatedtoexternalstorageStringpath=uri.getPath();if(action.equals(Intent.ACTION_MEDI
34、A_MOUNTED)&&externalStoragePath.equals(path)scan(context,MediaProvider.EXTERNAL_VOLUME);elseif(action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)&&path!=null&&path.startsWith(externalStoragePath+"/")scanFile(context,path);privatevoidscan(Contextcontext,Stringvolum
35、e)Bundleargs=newBundle();args.putString("volume",volume);context.startService(newIntent(context,MediaScannerService.class).putExtras(args);privatevoidscanFile(Contextcontext,Stringpath)Bundleargs=newBundle();args.putString("filepath",path);context.startService(newIntent(context,M
36、ediaScannerService.class).putExtras(args);BroadcasReceiver7MediaScannerHeceiuer+onReceieO:void-scanO:void-scanFileQ:voidFigure4-1Asthesourcecodes,andFigure4-1,therearetwodifferentmediadatabaseinthesystem,istheinternalstorage,theotheristheexternalstorage.Finally,theycallthemethodstartService()tostart
37、theMediaScannerService.AndroidMediaScannerServiceWecanfindthesourcefilewithpath/android/packages/providers/MediaProvider/src/com/android/providers/media/MediaScannerService.java.publicvoidonCreate()Threadthr=newThread(null,this,"MediaScannerService");thr.start();publicintonStartCommand(Int
38、entintent,intflags,intstartId)Messagemsg=mServiceHandler.obtainMessage();mServiceHandler.sendMessage(msg);returnService.START_REDELIVER_INTENT;publicvoidrun()mServiceHandler=newServiceHandler();)privatefinalclassServiceHandlerextendsHandler(OverridepublicvoidhandleMessage(Messagemsg)(if(filePath!=nu
39、ll)Uriuri=scanFile(filePath,arguments.getString("mimetype");)elsescan(directories,volume);)privatevoidscan(Stringdirectories,StringvolumeName)MediaScannerscanner=createMediaScanner();scanner.scanDirectories(directories,volumeName);)privateUriscanFile(Stringpath,StringmimeType)MediaScanners
40、canner=createMediaScanner();returnscanner.scanSingleFile(path,volumeName,mimeType);)ServiceHandlerMediaScannerService+handleMessage():void-mBinder:IMediaScannerService.Stub«interface»Runnable- openDatabase():void- closeDatabase():void- createMediaScanner():void- scan():void- scanFile():voi
41、d+onCreate():void+onStart():void+onDestroy():gid+run():void+onBindf):voidFigure5-1Androidapplicationmaybeblockwithinvokingservice,genericcreateathreadtorunatthebackend.First,mediaservicecallonCreate()tostarttheserviceifitisnotexist,thencreateathreadandrunthread.start()tocalltherunnablemethodwhichhas
42、implementedwiththerun().Intherun(),invokeainternalclassnamedServiceHandlertoscanfile.Inthemethodscan()andscanFile(),theyallinvokeapublicclassnamedMediaScannerwhomhasmethodnamedcreateMediaScanner()toprocessmetadataandmediadabase.AndroidMediaScannerWecanfindtherelatefileswithpathandroid/frameworks/bas
43、e/media/java/android/media,Figure6-1javacodesfile:/android/frameworks/base/media/java/android/media/MediaScanner.javapublicvoidscanDirectories(String口directories,StringvolumeName)for(inti=0;i<directories.length;i+)processDirectory(directoriesi,MediaFile.sFileExtensions,mClient);publicvoidscanFile
44、(Stringpath,longlastModified,longfileSize)/Thisisthecallbackfuntionfromnativecodes./Log.v(TAG,"scanFile:"+path);doScanFile(path,null,lastModified,fileSize,false);publicvoidscanFile(Stringpath,StringmimeType,longlastModified,longfileSize)doScanFile(path,mimeType,lastModified,fileSize,false)
45、;publicUridoScanFile(Stringpath,StringmimeType,longlastModified,longfileSize,booleanscanAlways)if(isMetadataSupported(mFileType)processFile(path,mimeType,this);elseif(MediaFile.isImageFileType(mFileType)/weusedtocomputethewidthandheightbutit'snotworthitresult=endFile(entry,ringtones,notification
46、s,alarms,music,podcasts);privateUriendFile(FileCacheEntryentry,booleanringtones,booleannotifications,booleanalarms,booleanmusic,booleanpodcasts)throwsRemoteExceptionmMediaProvider.insert()/mMediaProvider.update()privatenativevoidprocessDirectory(Stringpath,Stringextensions,MediaScannerClientclient);
47、privatenativevoidprocessFile(Stringpath,StringmimeType,MediaScannerClientclient);c+codesfile:/android/frameworks/base/media/jni/android_media_MediaScanner.cppstaticvoidandroid_media_MediaScanner_processDirectory(JNIEnv*env,jobjectthiz,jstringpath,jstringextensions,jobjectclient)MediaScanner*mp=(Medi
48、aScanner*)env->GetIntField(thiz,fields.context);MyMediaScannerClientmyClient(env,client);mp->processDirectory(pathStr,extensionsStr,myClient,ExceptionCheck,env);staticvoidandroid_media_MediaScanner_processFile(JNIEnv*env,jobjectthiz,jstringpath,jstringmimeType,jobjectclient)MediaScanner*mp=(Me
49、diaScanner*)env->GetIntField(thiz,fields.context);MyMediaScannerClientmyClient(env,client);mp->processFile(pathStr,mimeTypeStr,myClient);file:/android/external/opencore/android/mediascanner.cppstatus_tMediaScanner:processDirectory(constchar*path,constchar*extensions,MediaScannerClient&clie
50、nt,ExceptionCheckexceptionCheck,void*exceptionEnv)result=doProcessDirectory(pathBuffer,pathRemaining,extensions,client,exceptionCheck,exceptionEnv);status_tMediaScanner:doProcessDirectory(char*path,intpathRemaining,constchar*extensions,MediaScannerClient&client,ExceptionCheckexceptionCheck,void*
51、exceptionEnv)client.scanFile(path,statbuf.st_mtime,statbuf.st_size);status_tMediaScanner:processFile(constchar*path,constchar*mimeType,MediaScannerClient&client)status_tresult=PVMFSuccess;interror=0;InitializeForThread();OSCL_TRY(error,client.setLocale(mLocale);client.beginFile();/LOGD("pro
52、cessFile%smimeType:%sn",path,mimeType);constchar*extension=strrchr(path,'.');if(extension&&(strcasecmp(extension,".mp3")=0|strcasecmp(extension,".aac")=0)/Bothmp3andaacfilesuseID3tagstoholdmetadataresult=parseID3Tag(path,client);elseif(extension&&(str
53、casecmp(extension,".mp4")=0|strcasecmp(extension,".m4a")=0|strcasecmp(extension,".3gp")=0|strcasecmp(extension,".3gpp")=0|strcasecmp(extension,".3g2")=0|strcasecmp(extension,".m4b")=0|strcasecmp(extension,".3gpp2")=0)result=parseM
54、P4(path,client);elseif(extension&&strcasecmp(extension,".ogg")=0)result=parseOgg(path,client);elseif(extension&&(strcasecmp(extension,".mid")=0|strcasecmp(extension,".smf")=0|strcasecmp(extension,".imy")=0)result=parseMidi(path,client);elseif(e
55、xtension&&(strcasecmp(extension,".wma")=0|strcasecmp(extension,".wmv")=0|strcasecmp(extension,".asf")=0|strcasecmp(extension,".amr")=0|strcasecmp(extension,".wav")=0|strcasecmp(extension,".awb")=0)result=parseASF(path,client);elsere
56、sult=PVMFFailure;client.endFile(););OSCL_FIRST_CATCH_ANY(error,LOGV("OSCL_LEAVEhappenedinprocessFileExitwithfailure");returnPVMFFailure);returnresult;AsFigure6-1,IfscanDirectory()hascalledbyMediaScannerService,itwillinvokec+llibrarylibmedia_jnimethodprocessDiretorys()byJNImechanism,thenpro
57、cessDiretorys()invokeJAVAclassMyMediaScannerClientbyJNI,Finaly,endFile()usetoinsertorupdatethedatabase原文地址修改AndroidMediaScanner的扫描路径对Android稍有熟悉的人都知道,AndroidMediaScanner只对SD卡上的媒体文件进行扫描。其扫描的策略,请参考«AndroidMediaScannerProcess»o假如我们的硬件平台上面没有提供SD卡槽,难道Android就不能进行对媒体文件播放了吗?当然不是的,否则Android系统将不会成为
58、一个完善的Frameworko本文结合本人的经验介绍一下,怎样修改多媒体文件的扫描路径。根据AndroidMediaScannerProcess»的介绍我们可以知道,Androidscanner扫描媒体完成之后,会把媒体文件存放在数据库中,由MediaProvider为上层的应用程序提供服务。经过研究Mediascanner的代码发现,他的扫描路径为android.os.Environment.EXTERNAL_STORAGE_DIRECTORY定义该变量文件位于:frameworks/base/core/java/android/os/Environment.java默认情况下,A
59、ndroid将会搜索/sddisk目录:privatestaticfinalFileEXTERNAL_STORAGE_DIRECTORY=getDirectory("EXTERNAL_STORAGE","/sddisk");为了让其进行搜索我们自定义的路径,可以修改该变量的定义,加入我们希望扫描/external目录。代码修改如下:privatestaticfinalFileEXTERNAL_STORAGE_DIRECTORY=getDirectory("EXTERNAL_STORAGE","/external");这本AAndroidMediaScanner将会搜索/external目录来查找媒体文件。下一步我们需要保证这个文件一定要存在,我们需要修改init.rc文件。增加如下的定义:mkdir/external0777systemsystem这样在开机的时候,如果/external目录不存在,则会创建一个。如果已经存在,则不会有任何动作。另外怎样触发MediaScanner?根据Andr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年广告设计师调研技巧试题及答案
- 广告设计师考试时尚与广告的结合试题及答案
- 关于纺织行业未来发展的考试试题及答案
- 基本卫生法规试题及答案
- 服装导购考试题及答案
- 提高纺织品检验员考试通过率试题及答案
- 广告设计师考试品牌差异化策略试题及答案
- 湖北省电赛试题及答案
- 童年小学生试题及答案
- 广告设计师需掌握的核心概念试题及答案
- 急性ST段抬高型心肌梗死溶栓治疗专家共识2024解读
- 服务消费券发放的精细化实施方案
- 2025年国家电力安全知识竞赛题库及答案(共50题)
- 团结协作青春展新姿
- 给幼儿园讲医疗知识
- 2024年共青团入团考试题库及答案
- 2024年《BIM技术介绍》课件
- 核心素养视域下小学道德与法治生活化教学策略探究
- 人教版八年级下《生命.生态.安全》教案
- 有理数的加减混合运算教学设计 人教版
- 中职学生心理健康教育专题讲座
评论
0/150
提交评论