改进音乐播放器

来源:互联网 发布:秦皇岛网络问政平台 编辑:程序博客网 时间:2024/04/30 13:45

前几天看数据库时发现Android上一个以前没发现的好东西,那就是媒体库内容提供器,通过媒体库可以获得本地所有音频、视频以及图像文件的信息。这让我想起了之前做的音乐播放器,当时就不知道该如何获取本地音乐,最后做了一个文件浏览器让用户自己在文件系统里找,用起来实在太不方便了。现在才知道原来系统已经把这部分做好了,于是打算把原来的音乐播放器重新改造一下。

1.       MediaStore

MediaStore这个类是Android系统提供的一个多媒体数据库,Android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,Android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用那些封装好的接口就可以进行数据库的操作了。

要使用MediaStore首先得获得内容解析器ContentResolver,每个应用程序的上下文都有一个ContentResolver实例,可以通过Activity或者Service的Context获得:

ContentResolver contentResolver = this. getContentResolver();

获得ContentResolver后就可以通过查询方法获得一个Cursor:

cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,

                             null,null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

这里query方法第一个参数为希望查询的内容提供器数据的URL,我用的是外部存储的媒体URL;第二个参数是限定要返回的列的,传入null将返回所有列;第三个参数就是SQL中的WHERE语句,限定要返回的行的,同样,传入null将返回所有行;第四个参数是与第三个参数配合使用的,用来替换WHERE语句中的?;第五个参数表示返回结果的排列方式,传入null或者DEFAULT_SORT_ORDER将不排序。

获得Cursor后可以用 startManagingCursor(cursor);来让活动管理Cursor的生命周期,接着就可以使用Cursor的get和move提取所需信息了,下面就是一个简单的歌曲选择对话框:

musicList = newAlertDialog.Builder(MusicPlayerActivity.this).setTitle("选择歌曲").setCursor(cursor,new OnClickListener()

        {

         @Override

         publicvoid onClick(DialogInterface dialog,int which)

         {

             //TODO Auto-generated method stub

             cursor.moveToPosition(which);

             MSintent.putExtra("MusicName",cursor.getString(1));

             startService(MSintent);

         }

       

        },cursor.getColumnName(1));

1. 确认退出

现在很多程序都有退出前提示功能,因为想在播放器退出前选择是否后台继续播放,所以自己琢磨着想做一下,一开始想在Activity的生命周期里处理,就是Activity销毁前提示,但是发现无论是Toast还是Dialog都无法阻塞当前进程,也就是说即使显示了提示信息,程序也无法停下来,还是照样退出了,最终考虑还是得捕获用户的按键事件,在帮助文档里找了半天终于发现了Activity中的onBackPressed(),该方法默认是直接调用finish()结束当前应用,通过重写该方法可以实现我们自己对返回按键的响应方式:

@Override

    publicvoid onBackPressed()

    {

        if(isServiceRunning("com.bill.musicplayer.MusicService"))

        {

            exitDialog.show();

        }

        else

        {

            //再按一次退出程序

            if((System.currentTimeMillis()-exitTime)> 2000)

            {

                Toast.makeText(getApplicationContext(),"再按一次退出程序", Toast.LENGTH_SHORT).show();

                exitTime = System.currentTimeMillis();

            }

            else

            {

                finish();

            }

        }

    }

    我这里的响应方式分两种,第一是退出前正在播放音乐,这时我会显示一个Dialog,让用户选择是否后台播放音乐:

        exitDialog= new Dialog(this);

        exitDialog.setTitle(R.string.exit);

        exitDialog.setContentView(R.layout.exitdialog);

        //退出且后台播放音乐

        exit1Btn =(Button)exitDialog.findViewById(R.id.exit1Btn);

        exit1Btn.setOnClickListener(newView.OnClickListener()

        {

           

            @Override

            public voidonClick(View v)

            {

                // TODO Auto-generatedmethod stub

                exitDialog.cancel();

                finish();

            }

        });

        //退出且停止播放音乐

        exit2Btn =(Button)exitDialog.findViewById(R.id.exit2Btn);

        exit2Btn.setOnClickListener(newView.OnClickListener()

        {

           

            @Override

            publicvoid onClick(View v)

            {

                // TODO Auto-generatedmethod stub

                stopService(MSintent);

                exitDialog.cancel();

                finish();

            }

        });

        cancleBtn =(Button)exitDialog.findViewById(R.id.cancleBtn);

        cancleBtn.setOnClickListener(newView.OnClickListener()

        {

           

            @Override

            public voidonClick(View v)

            {

                // TODO Auto-generatedmethod stub

                exitDialog.cancel();

            }

        });


第二种情况是退出前不再播放音乐,这是我会显示一个Toast提示再按一次会退出程序,

用的是System.currentTimeMillis()来判断两次按键间时间间隔,如果小于两秒这退出:


除了onBackPressed()外,我们还可以通过onKeyDown(intkeyCode, KeyEvent event)处理其他按键事件。

就说这么多了,这个音乐播放器还得继续改进啊。。。