期末作业
1.成员介绍
成员介绍 学号 班级 博客园地址
李一泓 1600802120 计算机163班 https://home.cnblogs.com/liyih/
李海洋 1600802118 计算机164班 http://www.cnblogs.com/haihai251/
2.APK链接
https://coding.net/u/haihai250/p/123/git/blob/master/app-debug.apk
视频链接:
3.代码链接
https://coding.net/u/haihai250/p/123/git
4.介绍团队项目
4.1 团队项目的总体效果截图
歌曲列表:
播放界面:
4.2 实现的功能及其效果的描述
本次大作业我们是在第三次的作业上进行改动,将普通按钮变成音乐播放常用的图片按钮,将暂停和播放两个按钮合并在一起,将音乐列表界面和播放界面分开,音乐列表显示sd卡中的歌曲和歌曲信息,播放界面上面显示正在播放歌曲的歌名和歌手,我们还增加了进度条的功能,可以随意拖动改变歌曲的进度。
功能:1.首先我这里有两个页面需要相互跳转。使用了Intent配合bundle,将点击的歌曲的position打包近bundle中发到Main2Activity中,在Main2Activity中解除bundle使用数据bundle得到数据。
2.产生sd卡中所有的音乐文件。使用了listview,首先通过cursor得到所有音乐文件的信息,截取其中的歌名,作者和时长,进行一定的时长筛选得到符合要去的音乐文件,之后再适配器中将得到的信息输出到之前准备好的listview的子布局文件中。
3.音乐播放上一首下一首的实现。这里因为考虑到直接点击列表中的歌曲进行跳格式播放,所以我直接创了一个函数changeMusci‘用来跳转音乐,这个函数的参数是在listview监听器中的position,这个参数的意思是歌曲的编号,这个参数与你看到的歌曲在列表中的位置有直接关系,同时与你点的歌曲在列表中的位置有直接关系。所以可以这样使用。同时如果要实现上一首下一首,只要确定当前的position,将position加加或者减减就可以实现了。
4.在播放歌曲详细中显示歌曲信息。通过从Bundle中得到的position定位之前在列表中所点歌曲的位子,通过类似适配器输出的方法输出想要的信息,在这里是歌曲名称。歌曲作者,歌曲总时间。
5.实现进度条。首先进度条有两个时间与之对应。第一个时间是歌曲总时间在4中已经得到,第二个时间是歌曲现在所播放的时间,这个updateTime这个函数得到,之中用到了Handle进行实时的更新时间和跳转进度条上的时间。
5.给出项目中的关键代码
1.产生sd卡中所有的音乐文件。
mListView = (ListView) findViewById(R.id.list2);
list2 = new ArrayList<>();
list2 = adpter2.getMusicData(this);
adapter = new Adapter3(this, list2);
mListView.setAdapter(adapter);
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.AudioColumns.IS_MUSIC); if (cursor != null) { while (cursor.moveToNext()) { musiclist song = new musiclist(); song.song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); song.path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); song.size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE)); song.duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); song.singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); list.add(song); } cursor.close(); } return list; }
2.音乐播放上一首下一首和暂停和播放的实现。
private void changeMusic(int position) {//切歌 if (position < 0) { musicposition = position = list1.size() - 1; } else if (position > list1.size() - 1) { musicposition = position = 0; } if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); } try { mediaPlayer.reset(); mediaPlayer.setDataSource(list1.get(position).path); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } public void onClick(View v) { switch (v.getId()) { case R.id.play: if (!mediaPlayer.isPlaying()) { changeMusic(0); } break; case R.id.next: { changeMusic(++musicposition); ;} break; case R.id.last: changeMusic(--musicposition); break; } }
3.两个页面需要相互跳转
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { Intent intent = new Intent(MainActivity.this,Main2Activity.class); Bundle bundle = new Bundle(); bundle.putInt("id",position);//intent shixian kuajiemain intent.putExtras(bundle);//baozhuang startActivity(intent); } Bundle bundle = intent.getExtras(); number = bundle.getInt("id");
4.在播放歌曲详细中显示歌曲信息。
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
Bundle bundle = new Bundle();
bundle.putInt("id",position);//intent shixian kuajiemain
intent.putExtras(bundle);//baozhuang
startActivity(intent);
}
Bundle bundle = intent.getExtras();
number = bundle.getInt("id");
time2.setText(parseTime(mediaPlayer.getDuration()));//获得音乐总时间 name.setText(list2.get(position).song.toString());//duqu shuju singer.setText(list2.get(position).singer.toString());//duqushuju
5.实现进度条。(实时更新)
private Handler mHandler=new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message message) { int progress = mediaPlayer.getCurrentPosition(); seekbar.setProgress(progress); time1.setText(parseTime(progress)); updateProgress(); return true; } }); private void updateProgress() {//gengxinshijian Message msg = Message.obtain(); int progress = mediaPlayer.getCurrentPosition(); msg.arg1 = progress; mHandler.sendMessageDelayed(msg, 100); } private String parseTime(int oldTime) { SimpleDateFormat go = new SimpleDateFormat("mm:ss");//样式 String newTime = go.format(new Date(oldTime)); return newTime; public void onProgressChanged(SeekBar seekBar, int i, boolean b) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); mediaPlayer.seekTo(progress); } }
6.运行其他团队项目的apk,团队讨论,选出你心目中的前5名,并简单说明一下
优化:如果我来领导项目,我会将闪退问题解决,并在拍卖列表把物品的图片放上去,让用户对商品有一个更直观的了解,
7.写出团队所有成员做项目中遇到的问题,以及解决方法
李海洋:
1.点击列表里的歌或下一首时暂停播放按钮会自动切换,
解决方法:在跳转时和下一首的代码后面加上判断语句flag=true,图标显示播放。
2.第一首歌时放上一首,和最后一首歌时放下一首。
解决方法:在changemusic函数中,添加特殊情况,当position为list.size()-1时和position为0时分别讨论。
3.两个页面无法关联,无法传递值。
解决方法:使用intent,进行跳转页面,配合bundle将需要传递的值通过bundle打包起来在另一个页面中打开。
李一泓:
1.在list中点列表中的歌曲之后,跳转到另一个页面歌曲不会自动播放。
解救方法:通过传递过来的position值在初始化之后直接加让其开始播放的代码。
2.在list中点列表中的歌曲之后,跳转到另一个页面歌曲不会自动播放。
解救方法:通过传递过来的position值在初始化之后直接加让其开始播放的代码。
3.activity周期的问题,就是说第一个页面中选择歌曲之后跳转到第二个页面,第一个页面就结束了,当从第二个页面跳回第一个页面时歌曲停止播放说明第二个页面也停止了。
解决方法:有大致的思路但是还没解决,思路是修改activity生命周期中的某几个参数实现。
8.说明团队成员在本次项目中的分工、占了总工作的多少?以及对项目成员打分
姓名 分工 工作比例 分数(10分) 李一泓 代码实现,界面优化 50% 10 李海洋 代码优化,界面初稿 50% 10