android简易播放器设计.ppt_第1页
android简易播放器设计.ppt_第2页
android简易播放器设计.ppt_第3页
android简易播放器设计.ppt_第4页
android简易播放器设计.ppt_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务4 播放器,播放器,显示SD卡中的所有歌曲 列表控件的每一项可以显示一首歌曲的信息,如歌曲名称、演唱者等 点击一项后播放该歌曲,任务简介,Android控件-ListView Activity的生命周期 Activity之间的切换 Intent MediaPlayer 播放器的设计,1 ListView,1-1 ListView,ListView通过纵向列表的样式显示一组内容,内容较多时,可以拖动开始滚动条的移动和内容显示。 ListView继承自AdapterView,一般用于显示存储的数据,这些数据可能来自数组或者数据库。,ListView控件,数据,Adapter,1-1 ListView,实现ListView有多种办法 继承ListActivity(教材的第30章) 添加ListView控件 简单的字符串列表 显示SD卡的歌曲列表 自定义列表项,1-2 字符串列表,通过ArrayAdapter来连接字符串数组与控件。,ListView控件,字符串,ArrayAdapter,创建ArrayAdapter 参数1:当前的Context 参数2:Android自带的列表控件项ID 参数3:字符串数组,1-2 字符串列表,/获取ListView控件的变量 ListView listView = (ListView)findViewById(R.id.ListView01); /创建ArrayAdapter ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1,str); /将ArrayAdapter绑定到listview控件上 listView.setAdapter(adapter);,实现列表项单击的监听器,1-2 字符串列表,listView.setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView arg0, View arg1, int arg2,long arg3) /arg0:ListView控件 /arg1:被单击的列表项的View(目前是TextView) /arg2:被单击的列表项的位置 /arg3:暂不需要 );,1-3 显示SD卡的歌曲列表,通过Cursor访问Android自带的数据库,可以获取SD卡的歌曲列表,然后同SimpleCursorAdapter进行绑定。,ListView控件,SimpleCursorAdapter,字符串数据,Cursor,1-3 显示SD卡的歌曲列表,android.R.layout.simple_expandable_list_item_1,cursor,数据库名:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,1-3 显示SD卡的歌曲列表,/通过ContentResolver来访问Android媒体库,返回值为一个Cursor Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); /开始控制该Cursor startManagingCursor(cursor);,1-3 显示SD卡的歌曲列表,/ SimpleCursorAdapter创建 /参数1:当前的Context /参数2:Android自带的列表项ID /参数3:数据表的列名 /参数4:列表项中控件的ID ListAdapter listAdapter = new SimpleCursorAdapter( this, android.R.layout.simple_expandable_list_item_1, cursor,new StringMediaStore.EXTRA_MEDIA_TITLE,new intandroid.R.id.text1); /将Adapter与ListView绑定 listView.setAdapter(listAdapter);,1-4 自定义列表项,通过指定布局文件,可以自定义列表项,ListView控件,SimpleCursorAdapter,字符串数据,Cursor,1-4 自定义列表项,R.layout.listitem,cursor,数据库名:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,1-4 自定义列表项,/通过ContentResolver来访问Android媒体库,返回值为一个Cursor Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); /开始控制该Cursor startManagingCursor(cursor);,1-3 显示SD卡的歌曲列表,/数据库的列名 String cols = new String MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DATA ; /控件的ID int ids = new intR.id.trackname, R.id.artist, R.id.path; /创建adapter将数据库列名与控件ID对应上 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listitem, cursor, cols, ids); /将Adapter绑定到列表控件上 listview.setAdapter(adapter);,扩展练习,将SD卡歌曲显示到列表控件后,点击列表项,通过Toast能够提示所选歌曲的名称、路径。,2 Activity生命周期,2-1 Activity,对开发者而言,Activity是Android应用程序的入口。 在Activity类中定义了一系列的 生命周期方法,比如onCreate()、onResume()、onStart()、onPause()、onStop()和 onDestroy(),系统会在适当的时候调用对应的生命周期方法。,2-2 Activity状态,运行 当Activity位于堆栈的顶部时,它就处于运行状态(active)。 暂停 当Activity失去了焦点,但是依然可见时 ,Activity就处于暂停状态(paused),维持着成员信息和所有状态。 停止 当Activity完全被其他的Activity覆盖时,它就处于停止状态(stopped),处于停止状态的Activity依然维持着成员信息和所有状态,只是变得不可见了。 销毁 当Activity处于停止或者暂停状态时,系统可能要求它结束生命周期,或者直接把它所在的进程杀死,进而从内存中删除它,此时的Activity就被销毁了。,2-3 Activity生命周期,通过程序来观察Activity的 生命周期。,3 Activity间的调用,3-1 Activity,一个应用程序可以存在多个Activity 一个Activity可以切换到另外一个Acitivity Activity切换时,使用到Intent,3-2 创建新的Activity,步骤 新建Activity 新建布局 Activity绑定布局 注册Activity 启动Activity,3-2-1 新建Activity,在包上点击右键,【New】-【Class】 填写类名和父类,3-2-2 新建布局,在reslayout目录,点击右键,【New】-【Other.】-【Android XML File】,public class NewActivity extends Activity Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.newlayout); ,3-2-3 绑定布局,在代码的onCreate函数中,加入setContentView,3-2-4 注册Activity,在【 AndroidManifest.xml 】函数中添加新的Activity,Activity1中启动Activity2,3-2-5 启动Activity,startActivity(Intent)方法用于启动一个新的Activity,Activity1,Activity2,Intent,4 Intent,4-1 Intent,Intent是对执行某项动作的抽象封装 用于启动Activity,startActivity(Intent) 广播一个Intent给BroadcastReceiver 用于启动某个Service, startService(Intent) Intent是一个桥梁,将希望做的事情,封装在其中,然后通过传递过去,系统就知道你想干什么了。,4-1 Intent,代码,Intent,系统根据Intent的参数去做相应的事情,启动Activity 广播事件 启动Service,4-2 Intent,Intent有以下的属性 Action : ACTION_VIEW, ACTION_EDIT, ACTION_MAIN Data : 封装的数据,以Uri格式表示 Category : 标志动作执行的分类,例如CATEGORY_LAUNCHER Type : MIME Component : 标明Intent指向的class Extras : 用于在Intent中携带一些数据信息,4-2 Intent,Action的含义 ACTION_DIAL 发起一个电话呼叫 ACTION_BATTERY_LOW 电池电量低 ACTION_SCREEN_ON 手机屏幕打开,4-2 Intent,Data的含义 Data是以URI代表的数据和MIME代表的数据类型的集合。 Data通常根据Action的不同而不同,例如ACTION_CALL意味着Data是tel:URI的形式。 可以通过Intent.setData()和Intent.setType()设置URI和MIME类型。,4-2 Intent,Category的含义 与Action类似,Category也是一段字符串常量。 Category描述的信息可以帮助系统确定处理Intent的组件。 调用Intent.addCategory()可以在Intent中增加一个Category。,4-2 Intent,Extras的含义 Extras包含了键-值数据对,用于向目标组件传递数据。 Intent中包含了一系列的putExtra()和getExtra()方法用于存储和读取相关的数据类型。,以打开一个网页为例,4-3 Intent,Uri uri = Uri.parse(“”); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);,电话功能调用,4-3 Intent,Uri uri = Uri.parse(“tel:2125551212 “); Intent it = new Intent(Intent.ACTION_DIAL, uri); context.startActivity(it);,启动一个Activity为例 参数1:源Activity实例 参数2:启动的Activity类,4-3 Intent,Intent intent = new Intent(xxxActivity.this, DetailActivity.class); startActivity(intent);,启动一个Activity,并传递参数,4-3 Intent,Intent intent = new Intent(this, DetailActivity.class); intent.putExtra(“name“, peoplesposition); startActivity(intent);,protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); /获得Intent并从中读取附带的数据 Intent intent = getIntent(); String name = intent.getStringExtra(“name“); TextView view = new TextView(this); view.setText(“您选择了“+name); setContentView(view); ,5 多媒体,5-1 多媒体架构,多媒体驱动 负责和硬件进行交互数据,包括Audio Driver, Camera Driver,Display Driver等等,与其他Linux版本的Driver类似。 多媒体Native层 通常称之为OpenCORE,它是Android多媒体的核心,来源于PacketVideo公司。 多媒体框架层(MediaPlayer) 多媒体框架层Android中间层。向下通过JNI负责封装OpenCore,向上负责为多媒体应用程序提供Java接口。 多媒体应用程序 音乐播放器, 照相机等应用程序。,5-1 多媒体架构,5-2 多媒体格式,5-2 多媒体架构,5-3 MediaPlayer状态图,Idle Initialized Preparing Prepared Started Paused Stopped PlaybackCompleted End Error,5-4-1 多媒体编程-创建,方法1:使用New操作符创建MediaPlayer对象。 通过New操作符创建的对象处于idle状态。 方法2:通过MediaPlayer的create方法创建对象, 此对象产生后处于Prepared状态。,MediaPlayer player = new MediaPlayer();,MediaPlayer player = MediaPlayer.create(this, R.raw.test);,5-4-2 多媒体编程-设置音频数据,调用setDataSource()方法,设置音视频数据源。MediaPlayer进入Initialized状态。,MediaPlayer player = new MediaPlayer(); player.setDataSource(Audio_PATH);,5-4-3 多媒体编程-播放前准备,调用prepare()或者prepareAsync()方法,进行播放准备。MediaPlayer进入Prepared 状态。,MediaPlayer player = new MediaPlayer(); player.setDataSource(Audio_PATH); player.prepare();,5-4-4 多媒体编程-播放暂停,调用start()方法开始播放,MediaPlayer进入Started状态。 调用pause()方法暂停播放.对象进入Paused状态。,MediaPlayer player = new MediaPlayer(); player.setDataSource(Audio_PATH); player.prepare(); player.start();,player.pause();,5-4-4 多媒体编程-播放暂停,定位播放 调用seekTo(int msec)方法可以调整MediaPlayer的播放位置。 参数msec的单位是毫秒。,player.seekTo(POSITION);,5-4-5 多媒体编程-停止,调用stop()方法停止播放。MediaPlayer对象进入stopped状态。,player.stop();,5-4-6 多媒体编程-销毁,销毁MediaPlayer,player.release();,5-4-7 多媒体编程-常用方法,getDuration()获取媒体的播放总时长。 isPlaying()判断MediaPlayer是否在播放状态。 getCurrentPosition()获得目前播放的时间点。 setAudioStreamType(int streamtype)设置音量属性,音量分为多媒体音量和铃声音量等。 setVolume(float leftVolume, float rightVolume)设置音量大小。,5-5 多媒体播放,MediaPlayer可以从三种不同的位置播放。 从资源文件播放。 从文件系统播放。 从网络上播放。,5-5-1 多媒体编程-从资源文件播放,多媒体文件可以放在资源文件夹/res/raw目录下。 通过MediaPlayer.create()方法创建MediaPlayer对象。,MediaPlayer player = MediaPlayer.create(this, R.raw.test); player.start();,5-5-2 多媒体编程-从文件系统播放,获得MediaPlayer对象之后,需要依次调用setDataSource()和prepare()方法,以便设置数据源,让播放器完成准备工作。 。,try MediaPlayer player = new MediaPlayer(); player.setDataSource(“/sdcard/a.mp3“); player.prepare(); player.start(); catch (Exception e) e.printStackTrace(); ,5-5-3 多媒体编程-从网络上播放,在播放网络文件时,下载,播放等工作均有底层PVPlayer来完成,应用层开发者只需要设置网络文件的数据源即可。,String path = “http:/website/path/file.mp3“; try MediaPlayer player = new MediaPlayer(); player.setDataSource(path); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() public void onPrepared(MediaPlayer mp) mp.start(); ); player.prepareAsync(); catch (Exception e) e.printStackTrace(); ,5-6 注意,MediaPlay是有状态的,不是任何状态下都可以进行播放,具体请参照前面的状态图。如果一首歌曲在播放时,你想切换歌曲,请注意一定要先调用reset函数之后,才能再设定路径然后播放。,player.reset(); player.setDataSource(strPath); player.prepare(); player.start();,6 播放器,6-1 设计界面布局,main.xml:主界面布局 包含一个列表控件 listitem.xml: 列表项的布局 包含一些控件,这些控件可以显示歌曲的名称 具体每一项需要显示什么信息,请同学们自己考虑,但是一定要显示歌曲的路径,以备后续的点击播放。,6-2 读取SD卡上歌曲的信息,Android是通过底层的数据来记录歌曲信息的,可以通过ContentResolver来读取Android中关于歌曲的信息。,ContentResolver resolver = getContentResolver(); / 从Content Provider中获得SD卡上的音乐列表 Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); /控制Cursor startManagingCursor(cursor);,6-3 将数据库信息绑定到ListView,R.layout.listitem布局的trackname,artist,path控件绑定到数据库(cursor)中的以下三列数据。,R.layout.listitem,cursor,6-3 将数据库信息绑定到ListV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论