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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是实现的步骤: 1. 首先在布局文件中添加一个按钮用于控制音乐放和停止。 2. 在 MainActivity 中定义一个 MediaPlayer 对象,用于音乐。 3. 创建一个 Service 类来控制音乐放和停止。 4. 在 Service 类中定义一个 MediaPlayer 对象,用于音乐。 5. 在 Service 类中实现 onStartCommand() 方法,用于控制音乐放和停止。 6. 在 MainActivity 中实现按钮的点击事件,通过 Intent 启动 Service。 7. 在 Service 类中实现 onDestroy() 方法,用于停止音乐放并释放资源。 下面是完整的代码实现: MainActivity.java ``` public class MainActivity extends AppCompatActivity { private Button mBtnPlay; private Button mBtnStop; private boolean mIsPlaying = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnPlay = findViewById(R.id.btn_play); mBtnStop = findViewById(R.id.btn_stop); mBtnPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MusicService.class); if (!mIsPlaying) { startService(intent); mIsPlaying = true; mBtnPlay.setText("停止"); } else { stopService(intent); mIsPlaying = false; mBtnPlay.setText("放"); } } }); mBtnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MusicService.class); stopService(intent); mIsPlaying = false; mBtnPlay.setText("放"); } }); } } ``` MusicService.java ``` public class MusicService extends Service { private MediaPlayer mMediaPlayer; @Override public void onCreate() { super.onCreate(); mMediaPlayer = MediaPlayer.create(this, R.raw.music); mMediaPlayer.setLooping(true); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); } else { mMediaPlayer.start(); } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 布局文件 activity_main.xml ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/btn_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="放" /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btn_play" android:layout_centerHorizontal="true" android:text="停止" /> </RelativeLayout> ``` 注意:需要将音乐文件放在 res/raw 目录下,并命名为 music.mp3(或者其他名称),在代码中使用 R.raw.music 引用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值