期末作业

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

视频链接:

https://v.youku.com/v_show/id_XMzk5NjY1NjI2OA==.html?x&sharefrom=android&sharekey=143b5f15766140db8158c43d88abfb668

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名,并简单说明一下

(1)洪居兴组:游山玩水
项目简介:实现了手机验证码登录,首页有景区、酒店、美食、路线跳转到不同功能的界面,在攻略功能模块中,能够选择西北5省部的部分旅游景点,在驴友功能模块中,用户可以在其中发布寻找驴友的消息,并且进行查看详情。在个人信息中心,显示用户的基本信息,并在个人信息当中修改自己的信息。
优点:功能实现比较多,手机验证码登录和地图位置两个功能比较新颖,主界面中景区图片自动切换和景区精选版中可以手动滑动景区图片这两个特效还不错,界面也比较美观,里面信息量很多,可以看出来界面这块花费了很长时间,驴友和动态这块界面简洁友好,满足现代人的交友需求和交流需求,整体上还是很不错的。
缺点:每次打开时就要重新登录一次比较麻烦,景区和酒店搜索功能还没有实现,路线这块景区好像是随机出现的,如果能输入我想要去的景区就更好了,地理位置也只能显示我当前的位置,没有给出所去地点的路线;动态发布时如果可以加上图片就更加满足人们的需求了,毕竟现在很多人都喜欢晒图片。
优化:如果我来领导项目,我们会实现可以搜索景区和酒店这块功能,路线我会实现的更加全面,可以显示具体的路线,动态发布也会加上图片,更加满足人们的需求。我会早期给小组成员下达分工明确,项目尽早完成所有功能。
 
(2)汤文涛组:校园易
项目简介:实现的功能有登录、注册、密码修改、查看个人信息、上传商品、查看我的发布、查看所有商品、查看某个商品的详细信息、给商家留言这几个主要的功能。
优点:App贴近生活,登录、个人信息页面界面简介友好,商品分类很清楚,价格明确,可以自行发布信息。
缺点:界面不是很美观,每次重新打开就要登录很麻烦。里面的商品类别只有体育用品这块能点进去,点进去之后下面三个功能键也不能使用。发布商品这块添加的图片不能显示出来,查看我的发布界面太粗糙。个人信息修改界面上次保存信息的不会出现,需要全部重新输入很麻烦,而且联系方式、qq号和地址栏可以随意输入任何字符,对用户来说很不友好。
优化:如果我来领导项目,我会实现不用重复登录这一方面,首页里面我会添加更多的信息,使其他几类商品也能查看。发布商品这块也会使图片能很好的显示出来。修改界面显示上次修改的信息,使用户修改起来更加方便。我会早期给小组成员下达分工明确,项目尽早完成所有功能。
 
(3)刘宇莹组:电子拍卖
项目简介:本项目分为服务器端和安卓端,实现了登录、浏览拍卖物品、浏览流拍物品、添加拍卖物品、查看竞得商品信息、管理物品种类等功能。
优点:界面很美观,不同界面有不同的背景图片,布局也很合理,实现了有关拍卖的多种功能,并且设计了服务器端和安卓端,可以看出花了很多功夫。
缺点:登录界面有时会出现闪退,拍卖列表没有放上物品的图片,用户对商品没有一个直观的了解。
优化:如果我来领导项目,我会将闪退问题解决,并在拍卖列表把物品的图片放上去,让用户对商品有一个更直观的了解,
 
(4)季轩石组:任务计划提醒
项目简介:点击计划按钮,一个是定量计划,一个是打卡计划,打卡计划也是通过自定义填写内容可以直接生成一个打卡计划的卡片,然后每天可以通过该卡片生成一个打卡内容。还选中下面的菜单栏的第二个内容,然后点击添加TODO,输入你要提醒的事项,然后选择提醒时间,就可以添加提醒了。
优点:界面做的很炫酷,很符合现代人的审美观,添加计划和消息到时间提醒两个功能很实用,很多人每天都会制定计划然后去执行,什么时间做某件事软件会自动提醒,界面还可以切换白天、黑夜,软件实用性很高。
缺点:打卡部分会出现闪退;菜单栏的提醒功能,设定时间后并没有提醒我,比较郁闷;界面切换到白天时候,下面的功能键颜色太贴近导致很不清晰。
优化:如果我来领导项目,我会完成设定时间会提醒这块功能,当界面切换白天时,我会将下面功能键的颜色也随之发生改变,使界面更优化。早期我会给小组成员下达分工明确,使项目尽早完成所有功能,解决打卡闪退现象。
 
(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

 

   

posted @ 2019-01-01 21:53  1600802120-李一泓  阅读(421)  评论(0编辑  收藏  举报