MediaPlayer实现音乐文件的边下边播

这边的需求是仅仅是实现一个音乐的边下边播。思路就是截取后台返回的音乐链接。然后截取文件名,判断该文件是否在文件夹下存在。存在就使用sd卡的文件源进行播放,不存在就下载这个音乐文件,并且播放这个音乐链接。使用的是android自带的DownloadManager进行下载。默认是带标题栏的下载进度显示的,我们需要隐藏掉需要在清单文件下面进行配置, 需要权限隐藏
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
否则会抛出异常

DownloadManager.Request.setNotificationVisibility fails with jSecurityException: invalid value for visibility: 1

上代码,思路比较清晰
1、下载音乐文件

 //下载音乐文件
    private void downloadMusic(String url) {
        if (mMediaplayer == null) {
            //初始化
            mMediaplayer = new MediaPlayer();
            mMediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaplayer.setLooping(true);
        }
        String path = url;
        //创建下载任务,downloadUrl就是下载链接
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(path));
        String fileName = path.substring(path.lastIndexOf("/") + 1, path.length());
        downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + File.separator + fileName;
        File f = new File(downloadPath);
        if (f.exists()) {
            //重新设置资源
            try {
                mMediaplayer.reset();
                mMediaplayer.setDataSource(downloadPath);
                mMediaplayer.prepare();
                mMediaplayer.start();
                JLog.e("file already exists!");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        } else {
            //播放音乐
            palyUrl(url);
        }
        //指定下载路径和下载文件名
        request.setDestinationInExternalPublicDir("/download/", fileName);
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
        request.setVisibleInDownloadsUi(false);
        //获取下载管理器
        downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        //将下载任务加入下载队列,否则不会进行下载
        mTaskId = downloadManager.enqueue(request);
        registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }

    //广播接受者,接收下载状态
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            checkDownloadStatus();//检查下载状态
        }
    };

    //检查下载状态
    private void checkDownloadStatus() {
        DownloadManager.Query query = new DownloadManager.Query();
        query.setFilterById(mTaskId);//筛选下载任务,传入任务ID,可变参数
        Cursor c = downloadManager.query(query);
        if (c.moveToFirst()) {
            int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
            switch (status) {
                case DownloadManager.STATUS_PAUSED:

                case DownloadManager.STATUS_PENDING:

                case DownloadManager.STATUS_RUNNING:

                    break;
                case DownloadManager.STATUS_SUCCESSFUL:
                    break;
                case DownloadManager.STATUS_FAILED:
                    break;
            }
        }
    }

2、mediaplayer播放url

  /**
     * 播放音乐
     *
     * @param url
     */
    public void palyUrl(String url) {
        try {
            mMediaplayer.reset();
            mMediaplayer.setDataSource(url);
            mMediaplayer.prepare();
            mMediaplayer.start();
        } catch (IOException | IllegalArgumentException e) {
            e.printStackTrace();
        }

    }

3、本来是想在下载完成后切换播放源的。mMediaplayer.setDataSource(url);,所以定义了广播,监听是否下载完成,下载完成后切换播放源。然而实现不了,如果有更好的方法,请告知。而且系统自带的下载不是断点续传的。所以只是实现了,每次进入判断是否存在该文件,不存在就下载,第二次进入存在就直接播放了。这么简单就不上代码了,have a nice day

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值