已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
巢湖学院2013届本科毕业论文(设计) XX学院本科毕业论文(设计)题 目 基于Android平台的音乐播放器设计与实现 院(系) 电子工程与电气自动化学院 专 业 电气工程及其自动化 学生姓名 学 号 指导教师 职称 论文字数 80000 完成日期: 年 月 日23巢湖学院本科毕业论文(设计)诚信承诺书本人郑重声明:所呈交的本科毕业论文(设计),是本人在导师的指导下,独立进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。本人签名: 日期: 巢湖学院本科毕业论文 (设计)使用授权说明本人完全了解巢湖学院有关收集、保留和使用毕业论文 (设计)的规定,即:本科生在校期间进行毕业论文(设计)工作的知识产权单位属巢湖学院。学校根据需要,有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许毕业论文 (设计)被查阅和借阅;学校可以将毕业论文(设计)的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编毕业,并且本人电子文档和纸质论文的内容相一致。保密的毕业论文(设计)在解密后遵守此规定。本人签名: 日期: 导师签名: 日期: 基于Android平台的音乐播放器设计与实现摘 要Android是一种基于Linux的自由及开放源代码的操作系统,其最大的优势就是显著的开放性。开放的源码吸引大量的开发者和手机开发商,开放的平台带来更大的竞争,让更多的消费者能够以低价位买到心仪的手机。随着智能手机的普遍和Android应用的日益丰富,一个崭新的平台也将走向成熟。本课题的目的就是开发出一款基于Android平台,可以播放MP3歌曲文件的音乐播放器。播放器的界面新颖,功能丰富,操作方便。播放器主要从界面的设计着手,设计了欢迎界面、功能界面、扫描界面、显示歌曲列表界面,播放及显示歌词界面,实现了播放歌曲的基本功能,还有歌词同步显示、支持手势切换、后台播放歌曲,自动关闭播放器等功能。 关键词:Android;开放;音乐播放器Design and Implementation of Music Player Based on Android PlatformAbstract Android is a free and open source Linux-based operating system with openness significantly. Open source attract a lot of developers and mobile manufacturers , an open platform can bring more greater competition, lead to more consumers to buy low-priced favorite phones. A new platform will be mature with smartphones widespreadly and Android applications rich increasingly. The purpose of this title is to develop a music player based on Android platform, that can play MP3 music files. The player has pretty UI(User Interface), abundant function, and easy to operate. It mainly start from the design of UI, design the welcome interface, function interface, scanning interface, display the songs list interface, play music and show lyrics interface, realized the basic playing function besides show lyrics synchronously, support for gestures to switch, play musics background, automatically shut down player, and other functions.Key Words:Android, open, Music Player目 录第一章 绪论11.1 研究背景及意义11.2 研究内容1第二章 Android应用概述22.1 创建Android应用22.2 项目目录简介2第三章 播放器总体设计43.1 播放器功能需求分析43.2 播放器设计总体流程5第四章 播放器设计与实现64.1 界面的设计64.2 功能的实现74.2.1 动态图片的实现74.2.2 Adapter的实现84.2.3 扫描文件的实现114.2.4 数据存取的实现124.2.5 手势滑动的实现134.2.6 歌词显示的实现134.2.7 播放歌曲的实现15第五章 播放器运行测试18参考文献20致 谢21第一章 绪论1.1 研究背景及意义Android,一种基于Linux的自由及开放源代码的操作系统。2012年11月数据调查显示,Android占有全世界智能手机操作系统76%的市场份额,而中国市场占有率达90%。随着Android智能手机价格的平民化,那些功能不强,画面单调,键盘操作过时的塞班系统手机已经逐渐被淘汰了。在Android平台开发应用或游戏,前景广阔,市场需求量大。以前落后的操作手机上所有能玩的,在Android平台都能做到,而且做得更好,界面效果更炫,用户体验更佳。本项目是一款基于Android平台的音乐播放器。这是一个对于开发者而言比较容易上手的项目,对于用户来说是一个常用的应用软件。研究了多款音乐播放器应用,积累了一定的图片素材,借鉴了部分的布局设计,为本项目的开发做好充分准备。本项目希望可以做到让用户随时随地处于音乐旋律之中,获得舒缓压力,调整心情的最佳体验。同时,使设计者更加熟练的使用Android技术,积累开发项目的宝贵经验。1.2 研究内容目前,Android手机音乐播放器技术虽然已经成熟,但是用户体验并不很好,为用户加载许多不必要图片信息,植入一些烦人的广告,浪费用户流量。本项目制作的是一款简约而不简单的音乐播放器,以下将是本项目需要深入研究的内容:1、 Android的界面添加动态图片;2、 编写Sqlite数据库语句存取用户数据;3、 对播放器界面增加手势的支持;4、 关闭播放器界面后台播放歌曲;5、 播放界面同步显示歌词。6、 歌词界面增加手势改变播放进度的功能。7、 实现定时自动关闭播放器功能。第二章 Android应用概述2.1 创建Android应用新建一个Android项目,新建的项目信息如图2-1所示:这是最新版ADT(Android Development Tools)插件,版本21。如果ADT版本较低,界面是不同的。项目要求智能手机最低Android 2.2系统。图2-1新建Android Project2.2 项目目录简介1. 展开res目录,如图2-2所示。anim、drawable和raw默认是没有的。这是本项目需要新建的,且文件夹的命名是固定的。res是resource的缩写,里面存放许多资源文件,可以直接被我们在代码中直接引用。anim主要存放动画布局xml文件,drawable、drawable-hdpi、drawable-ldpi、drawable-mdpi和drawable-xhdpi都是存放图片资源的,根据手机的分辨率的不同自动匹配使用什么样的图片。layout目录是存放界面布局文件,values目录存放字符串资源,颜色资源,尺寸大小资源等。2. 与res目录功能类似的是assets目录,但是assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件是不能直接引用的,可以存放一些图片,html,js, css等文件。图2-2 res目录的层次3. 如图2-3所示,gen目录是Android系统自己所维护的文件目录,目录下的R文件自动编译生成,自动更新修改。R文件是预编译res目录所生成的Java文件,如果在drawable-hdpi目录下存放一张背景图片splash_bg.png;那我们在Java代码中引用这张图片资源就是 R.drawable.splash_bg。图2-3 gen目录的层次4.如图2-4所示,bin目录里存放的是编译好的二进制文件,设计者只需要知道bin目录里有这个项目所生成的apk文件,可以直接安装在手机上运行。图2-4 bin目录的层次5. 如图2-5所示,src目录存放设计者所写的所有Java代码,目录里的文件夹都是每个类所在的包名,Java中包的概念就是给文件分类到不同的文件夹中。图2-5 src目录的层次第三章 播放器总体设计 3.1 播放器功能需求分析 项目的设计流程通常是基于项目的功能来安排设计的。以下是播放器的功能需求分析:1. 提供两种扫描SDCard(手机内存卡)中MP3歌曲文件的方式,一键扫描所有存在的歌曲文件和用户指定文件夹进行扫描。2. 扫描完成后,歌曲自动分类,保存到Sqlite数据库。Menu菜单提供重新扫描的功能,方便用户再次扫描。3. “本地音乐”界面中可以添加或者移除最爱歌曲,添加音乐到“播放列表”,在“播放列表”中移除歌曲。4. 播放歌曲设定,暂停和改变播放进度。选择上一首,下一首,改变播放的模式(顺序播放,单曲循环,全部循环,随机播放)。5. 主界面时,手指滑动屏幕,就可以跳到显示歌词界面,在显示歌词界面中能同步显示歌词,手指滑动屏幕,改变播放进度。隐藏播放器界面,后台播放歌曲。通知栏显示播放曲目。6. 提供自动关闭播放器的功能。当用户点击Menu中弹出的“睡眠”菜单,选择多长时间后关闭,播放器会自动关闭。7. 本播放器在界面上做了一个尝试性的创新,让界面显示一张动态图片,(android系统不能直接显示.gif动态图片的)。 3.2 播放器设计总体流程Step1:欢迎界面准备好raw文件下的音频文件播放音乐;在布局文件中定义一个ImageView控件,用Handler控制显示不同图片,形成gif动画效果;然后用Handler控制不同背景图片的显示。Step2:功能主界面主界面的布局文件内容:在顶部显示动态图片,底部显示播放控制的控件,中间显示未知,是可变的区域,用于显示功能菜单、歌曲列表等内容的区域。Step3:选择扫描方式界面显示两个Button按钮控件,监听器事件不同。点击自定义扫描,跳转到另一个Activity界面,用户指定文件夹扫描的界面Step4:自定义扫描界面显示手机内存卡可以操作的文件夹目录层次,用户点击CheckBox单选框选择扫描,出现扫描按钮,点击扫描。显示目录层次用ListView,需要编写合适的Adapter。Adapter含有CheckBox事件监听器。扫描歌曲完成后,需要对歌曲信息分类,然后创建表来保存数据,需要编写Sqlite数据存储业务逻辑代码。Step5:显示歌曲界面扫描完成后,显示歌曲界面。可以用同一个ListView,但需要编写不同的Adapter。显示“本地歌曲”的Adapter需要有添加最爱歌曲和添加到“播放列表”两个按钮;显示“播放列表歌曲”需要有移除歌曲按钮;显示其他歌曲界面不需要其他按钮。Step6:播放歌曲编写Service类,可以后台播放歌曲。用Handler控制SeekBar进度的更新。暂停、上一首、下一首、播放模式的控制全部由Service来完成。Step7:显示歌词用IO流读取lrc文件,分别读取时间和内容。然后用Handler不断的更新显示的歌词位置。手势滑动,获取滑动距离,换算成时间,改变播放进度。Step8:Menu界面和功能Menu采用PopupWindow弹出菜单,功能有扫描,睡眠,退出,重新扫描即清空数据库信息,定时关闭使用线程检测是否到达指定时间,退出功能需要关闭数据库,关闭Service,finish Activity。第4章 播放器设计与实现 4.1 界面的设计Android应用开发中在res/layout目录中编写xml文件来设计界面。如图4-1是第一个界面,也是播放器的欢迎界面,在LinearLayour布局中使用ImageView控件,不断改变ImageView显示的图片,形成动态效果。 图4-1 播放器欢迎界面如图4-2所示是欢迎界面跳转之后的功能主界面。顶部显示动态图片,中间显示了功能清单,底部显示播放歌曲控制的控件。接着需要编写用户扫描歌曲的界面,如图4-3所示。选择扫描方式的界面提供给用户两个Button。扫描歌曲完成后需要显示歌曲列表,这是需要用ListView搭配合适的适配器Adapter来实现的,关于Adapter的使用后面论述。Android任何功能实现的基础都是良好的界面,界面的好坏直接影响到用户的好感度,所以对于Android应用的开发,尤其要注意界面的开发。如今大多数应用的版本升级,做的基本上都是设计更好的界面赢得更多用户的青睐。图4-2 播放器主界面图4-3 选择扫描方式 4.2 功能的实现 4.2.1 动态图片的实现动态图片需要在drawable目录下,新建xml文件,根元素是level-list。代码如下:有多少帧图片对于编写多少个item。在代码中用Handler控制,主要逻辑代码如下:private int level = 0;/定义一个变量,控制显示第几张图片,值与android:maxLevel的值对应。private Handler mHandler = new Handler() public void handleMessage(android.os.Message msg) if (msg.what = -1) level+;/ 自增if (level = 50) /停止显示动画,进行下一步操作。 else anim_imageview.getDrawable().setLevel(level); / 不断的切换下一张图片sendEmptyMessageDelayed(-1, 100); /图片切换间隔时间为100ms 在onCreate方法中执行mHandler.sendEmptyMessage(-1);那么就会立即执行Handler中的handleMessage方法,匹配msg.what = -1的代码块执行。然后再sendEmptyMessageDelayed(-1, 100); 表示延时100ms继续执行msg.what = -1的代码块,类似于一种循环的效果。 4.2.2 Adapter的实现安卓应用绝大多数情况需要使用到ListView控件,而显示ListView控件就通常需要编写合适的Adapter。Adpter的作用就是告诉ListView控件每个Item布局(子布局)显示什么,怎样显示。所以编写一个Adpter,首先编写Item布局显示的内容。下面是一个Adapter的核心代码,实现效果如图4-4所示。public class ListingMusicAdapter extends BaseAdapter private Context mContext; private List listingMusics; /播放列表中的歌曲public ListingMusicAdapter(Context mContext,List listingMusics) this.mContext = mContext;this.listingMusics = listingMusics;public int getCount() return listingMusics.size(); / 返回个数对应显示子布局的个数public Object getItem(int position) return listingMusics.get(position);public long getItemId(int position) return position;/ Adpter的编写,重点是需要重写getView方法。public View getView(final int position, View convertView, ViewGroup parent) ViewHolder holder = null;if (null = convertView) convertView = LayoutInflater.from(mContext).inflate(R.layout.list_musics_item, null);holder = new ViewHolder();holder.music_count = (TextView) convertView.findViewById(R.id.listing_music_seq);holder.music_name = (TextView) convertView.findViewById(R.id.listing_music_name);holder.music_singer = (TextView) convertView.findViewById(R.id.listing_singer);holder.subLay = (LinearLayout) convertView.findViewById(R.id.listing_sub_layout);convertView.setTag(holder); else holder = (ViewHolder) convertView.getTag();holder.music_count.setText(position + 1) + );holder.music_name.setText(listingMusics.get(position).getMusic_name();holder.music_singer.setText(listingMusics.get(position).getSingername();holder.subLay.setOnClickListener(new View.OnClickListener() public void onClick(View v) / 数据库更新播放列表中的歌曲。);return convertView;class ViewHolder TextView music_count;TextView music_name;TextView music_singer;LinearLayout subLay; 图4-4 播放列表的歌曲界面Adapter编写好之后,使用Adapter代码如下:View view= inflater.inflate(R.layout.local_music, null);ListView listingView = (ListView) view.findViewById(R.id.local_music_listview);ListingMusicAdapter listingAdapter = new ListingMusicAdapter(this,listingMusics);listingView .setAdapter(listingAdapter); / ListView调用setAdapter方法。listingView .setOnItemClickListener(itemPlayListener);播放器很多界面都需要编写Adapter,原理是一样的,不同的是getView方法根据不同布局效果的重写内容。4.2.3 扫描文件的实现项目设定两种扫描歌曲文件的方式。一键扫描,扫描SDCard中所有歌曲文件;自定义扫描,扫描用户指定的文件夹中MP3歌曲文件。第一种方式,使用系统对外提供ContentProvider的URI(统一资源标识符,标记唯一性的),MediaStore.Audio.Media.EXTERNAL_CONTENT_URI。Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER);获得Cursor对象,对其进行循环遍历可以得到所有歌曲,然后进行存储。String musicName = cursor.getString(cursor /获取歌曲的名字.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);String album = cursor.getString(cursor /获取歌曲专辑名字.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);String artist = cursor.getString(cursor /获取歌手名字 .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);String url = cursor.getString(cursor /获取歌曲所在文件目录路径getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);当用户点击自定义扫描,页面会切换到另一个Activity,界面如图4-5所示。这个界面需要编写Adapter,然后给CheckBox注册监听器。图4-5 自定义扫描歌曲的界面用户选中某些文件夹,然后编写递归方法对文件夹检测所包含的MP3文件,存储到一个集合中,再重新对该集合中文件路径遍历,与系统提供的歌曲URI遍历的路径比较,相等即可获取歌曲信息,并保存到数据库中。 4.2.4 数据存取的实现扫描文件,需要保存在数据库中。保存到Sqlite数据,需要新建一张表。Android系统提供一个SQLiteOpenHelper类,设计者继承这个类就可以很方便的建立一张数据表,重写OnCreate方法,执行建表的SQL语句(SQL语句的编写与大部分数据库建表的语法是相同的)即可。表建好之后就是设计者要编写对表增删改查四种操作的业务逻辑代码。以下是SQLite操作简要的代码:第一步:创建表public void onCreate(SQLiteDatabase db)/编写创建表的SQL语句 “create table ”+TABLE_NAME+./执行SQL语句: db.execSQL(sql)第二步: 打开数据库,调用getWritableDatabase()方法private SQLiteDatabase db;public SqlBo(Context context) db = new DBHelper(context).getWritableDatabase();第三步:编写数据操作方法:public void insert(Music music) /保存歌曲/ insert into编写插入一条记录的SQL语句;/执行db.execSQL(sql,new Object)public List findAllMusic() /获取所有歌曲Cursor cursor = db.rawQuery(select * from + DBHelper.TABLE_NAME,null);/对cursor对象进行循环遍历,保存到集合中public Music findMusicById(int id) /获取单个Music对象Cursor cursor = db.rawQuery(select * from + DBHelper.TABLE_NAME+ where _id=?, new String id + );/遍历cursor,创建music对象,然后给music对象属性赋值public int updateFavorite(Music m) /修改歌曲信息 /执行 db.update(表名,修改的值,字段名,字段值);语句public void deleteAll() /清空所有歌曲信息db.delete(DBHelper.TABLE_NAME, null, null); 4.2.5 手势滑动的实现Android系统支持手势功能,播放器添加了对手势的支持。当用户滑动屏幕,页面会跳转,歌词会改变进度,这些都需要手势来完成的。手势的实现思路如下:implements OnGestureListener,OnTouchListener/实现或注册上述两个监听器接口private GestureDetector mGestureDetector; /用于识别手势的对象/onCreate方法中,给mGestureDetector赋值mGestureDetector = new GestureDetector(this);public boolean onTouch(View v, MotionEvent event) return mGestureDetector.onTouchEvent(event);public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) /重写onFling方法float x1 = e1.getX();float x2 = e2.getX();/检测两点间的距离和滑动时的速率velocityX/判断滑动时的方向(左右)和速率 4.2.6 歌词显示的实现歌词的实现前提是歌词文件与歌曲文件名字相同,在同一目录下,而且歌词文件格式是lrc。设计思路是自定义一个LrcView继承View重写OnDraw方法,在定义一个Lrc歌词对象,声明onDraw方法,让对象自己进行绘制。代码思路如下:public class LrcView extends Viewprotected void onDraw(Canvas canvas) lrc.onDraw(canvas, getWidth(), getHeight();/lrc对象自己绘制,传入Canvas作为画家,设定画布的宽和高public void updateTime(int currentPosition) lrc.updateTime(currentPosition);/及时更新显示歌词播放时间public class Lrc 1.判断有没有歌词文件,有就用IO流读取歌词文件,解析出时间和内容 2.把解析出的时间和内容封装成一个对象存放,在把这个对象存放到List集合中。 3.根据播放歌曲进度传入的参数在Lrc对象中定义的onDraw方法中动态改变歌词 显示的内容和位置歌词的显示难点是怎么确定一句话显示的位置,也就是第一个字的显示的x,y坐标。已知LrcView的宽width和高height,根据Paint对象,可以求出一句话所占的面积,即宽textWidth=p.measureText(str)和高textHeight=p.getSize()。X = (width-textWidth)/2; 求出x的坐标。图4-6 求出y坐标图例图4-6 求出y坐标手势滑动改变播放进度及歌词的显示,是在播放歌曲的Activity中给LrcView设置OnTouchListener,重写onTouch方法,判断是否移动和移动的距离,然后与y坐标相加或相减。移动距离的变化值除以所有歌词包括间距的总距离的比值等于播放的进度的变化值除以歌曲总进度。从而求出播放进度的变化值,然后加上当前播放的进度,就可以改变歌曲的播放进度。 4.2.7 播放歌曲的实现 播放歌曲用到了Android中的另一个重要控件Service。Service本质同Activity是一样的,但是Service是没有界面的而Activity有界面,Service可以当应用退出Activity销毁的时候依然运行在手机后台中。以下介绍Service的使用。/创建Servicepublic class MusicService extends Service public void onCreate() super.onCreate();player = new MediaPlayer(); /初始化MediaPlayer对象manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);/初始化NotificationManager对象 /Service同Activity类似,也是由系统创建对象的,所以需要定义在AndroidMainfest.xml文件声明定义: /重写onBind方法,这是能够与Activity交互的常用途径public IBinder onBind(Intent arg0) return new MyBinder();public class MyBinder extends Binder /Service的启动只会执行一次onCreate方法,当与Activity绑定,onBind方法得到调用,返回MyBinder对象,然后操作MyBinder对象去播放歌曲和显示通知栏。/Service与Activity绑定private MusicService.MyBinder binder;/声明binder对象/创建一个ServiceConnection对象,当绑定和解绑Activity时作为参数传入private ServiceConnection conn = new ServiceConnection() public void onServiceDisconnected(ComponentName name) public void onServiceConnected(ComponentName name, IBinder service) binder = (MusicService.MyBinder) service; /调用Service的onBind方法。/需要做一些处理,比如更新SeekBar的进度显示;/启动并绑定服务if (null = binder) Intent intent = new Intent(this, MusicService.class);startService(intent); /启动MusicService服务bindService(intent, conn, BIND_AUTO_CREATE); /绑定服务,onServiceConnected得到调用,给binder对象赋值。/停止绑定和停止服务unbindService(conn); /解除绑定Intent intent = new Intent(HomeActivity.this, MusicService.class);stopService(intent); /停止服务当服务启动并绑定好之后,就只需要操纵binder对象,所以在binder类中定义播放和控制的代码。下面说明歌曲的播放代码思路:player.reset(); /播放歌曲前先前置player.setAudioStreamType(AudioManager.STREAM_MUSIC);/声音大小随手机的设置变化musicUri = Uri.parse(music.getMusic_path();/根据路径转换成URI对象player.setDataSource(MusicService.this, musicUri);/添加播放的歌曲 player.prepare(); /准备播放player.setOnPreparedListener(preparedListener);/当准备完毕后播放player.setOnCompletionListener(listener); /当播放完毕后处理其他逻辑代码,比如下一首播放OnPreparedListener preparedListener = new OnPreparedListener() public void onPrepared(MediaPlayer mp) mp.start();/ 开始播放歌曲;OnCompletionListener listener = new OnCompletionListener() public void onCompletion(MediaPlayer mp) /下一首,还是单曲循环,等等逻辑代码的处理 ;/播放其他操作player.pause(); /暂停播放player.start(); /暂停继续播放player.seekTo(progress); /改变播放歌曲的进度/关闭服务
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年财务规划师考试《财务咨询与规划》备考题库及答案解析
- 2025年公共关系专业资格(公共关系从业资格)备考题库及答案解析
- 清洁服务合同协议2025年标准
- 配送服务交接协议2025
- 零售行业库存数据合同协议2025年
- 居家办公员工协议合同2025
- 健身教练2025年合同协议
- 商铺赠送咨询合同范本
- 场馆租赁服务合同范本
- 场景化营销协议书范本
- 咨询类外贸职业规划方案(3篇)
- 四年级数学(除数是两位数)计算题专项练习及答案
- 校长在教学质量推进会上划重点:6个“立即行动”+3点硬要求期中逆袭就靠这波操作
- 2025-2026学年高一上学期《拒绝手机进校园点亮校园时光》班会课件
- 胸廓畸形患者的护理
- 蜀绣课件教学课件
- 2025年10月全国机关管理自考试题及答案
- 过敏性哮喘的试题及答案
- 文化对营销的影响
- 守望成长·法治护航主题班会
- 社区宣传环保活动
评论
0/150
提交评论