• 简介
    Android的多媒体框架包括支持播放多种常见的媒体类型,使您可以轻松地把音频、视频和图像集成到你的应用。你可以播放音频或视频媒体文件,这些文件是存储在你的应用程序的资源文件中的。应用程序的资源文件可以是文件系统中独立的文件,或通过网络连接获取的一个数据流,所有使用MediaPlayer APIS的资源文件。
    注意:你只能在标准输出设备上播放音频数据。目前,标准输出设备是移动设备的扬声器或耳机。你不能在谈话音频调用期间播放声音文件。

三种播放方式
播放本地资源文件

public void playFromRes(View v){MediaPlayer mp=MediaPlayer.create(this,R.raw.zhh);mp.start();}

播放系统文件

  public void playFromSys(View v){MediaPlayer mp=new MediaPlayer();String path= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath()+"/zhh.mp3";try {mp.setDataSource(this, Uri.parse(path));//设置数据源mp.prepare();//同步执行mp.start();} catch (IOException e) {e.printStackTrace();}}

播放网络文件

public void playFromInternet(View v){String path="http://fs.w.kugou.com/201904231441/48036033298fec2f60d6a81a8aeaca63/G137/M06/08/17/yQ0DAFuGdOCABiECAE4jb57rgmY473.mp3";//这个链接不可用了MediaPlayer mp=new MediaPlayer();try {mp.setDataSource(this,Uri.parse(path));mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}});mp.prepareAsync();//异步缓冲} catch (IOException e) {e.printStackTrace();}}

权限设置

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

状态转换图

简单的播放器实现

import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;/*** 简单的播放器实现*/
public class Main2Activity extends AppCompatActivity implements View.OnClickListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {private MediaPlayer mp;private int index=0;//表示当前要播放音乐的索引private ArrayList<String> musicList=new ArrayList<>();private Button button_play,button_pause,button_next,button_prev;private boolean isPause=false;//true表示暂停状态@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);initView();initMusic();mp=new MediaPlayer();mp.setOnPreparedListener(this);mp.setOnErrorListener(this);mp.setOnCompletionListener(this);}private void initView(){button_play=findViewById(R.id.button6_play);button_pause=findViewById(R.id.button7_pause);button_next=findViewById(R.id.button5_next);button_prev=findViewById(R.id.button4_prev);button_play.setOnClickListener(this);button_pause.setOnClickListener(this);button_next.setOnClickListener(this);button_prev.setOnClickListener(this);}public void initMusic(){String root= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();musicList.add(root+ File.separator+"/zhh.mp3");musicList.add(root+ File.separator+"/qjtx.mp3");musicList.add(root+ File.separator+"/myhs.mp3");musicList.add(root+ File.separator+"/cl.mp3");}@Overridepublic void onClick(View v) {
switch (v.getId()){case R.id.button6_play:play();break;case R.id.button7_pause:pause();break;case R.id.button5_next:next();break;case R.id.button4_prev:prev();break;default:break;
}}
//上一首private void prev() {if (index-1>=0){index--;}else {index=musicList.size()-1;}start();}
//下一首private void next() {if (index+1<musicList.size()){index++;}else {index=0;}start();}//暂停private void pause() {if (mp.isPlaying()){mp.pause();isPause=true;}}//播放private void play() {if (isPause){mp.start();isPause=false;}else {start();}}//重头开始播放音乐
private void start(){if(index<musicList.size()){if (mp.isPlaying())mp.stop();mp.reset();//重置String musicPath= musicList.get(index);try {mp.setDataSource(musicPath);mp.prepareAsync();} catch (IOException e) {e.printStackTrace();}}
}@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}@Overrideprotected void onDestroy() {super.onDestroy();if (mp!=null){if (mp.isPlaying())mp.stop();mp.release();}}@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {mp.reset();return true;}@Overridepublic void onCompletion(MediaPlayer mp) {next();}
}

权限



以服务的形式后台运行

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.wifi.WifiManager;
import android.os.Environment;
import android.os.IBinder;
import android.os.PowerManager;import java.io.File;
import java.io.IOException;public class MusicService extends Service implements MediaPlayer.OnPreparedListener {public static final String ACTION_PLAY="com.my.ACTION_PLAY";public static final String ACTION_PAUSE="com.my.ACTION_PAUSE";public static final String ACTION_EXIT="com.my.ACTION_EXIT";private WifiManager.WifiLock lock;private MediaPlayer mediaPlayer;public MusicService() {}@Overridepublic void onCreate() {super.onCreate();mediaPlayer=new MediaPlayer();mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);//保持WIFI正常工作WifiManager wifiManager= (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);lock=  wifiManager.createWifiLock("mylock");lock.acquire();mediaPlayer.setOnPreparedListener(this);}@Overridepublic void onDestroy() {super.onDestroy();lock.release();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {String action=intent.getAction();if (ACTION_PLAY.equals(action)){mediaPlayer.reset();try {mediaPlayer.setDataSource(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+ File.separator+"qjtx.mp3");mediaPlayer.prepareAsync();} catch (IOException e) {e.printStackTrace();}}else if (ACTION_PAUSE.equals(action)){if (mediaPlayer.isPlaying()) mediaPlayer.pause();}else if (ACTION_EXIT.equals(action)){if (mediaPlayer.isPlaying())mediaPlayer.stop();mediaPlayer.release();}return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}
}
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;public class Main3Activity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);}
public void play(View v){Intent intent=new Intent(this,MusicService.class);intent.setAction(MusicService.ACTION_PLAY);startService(intent);
}public void pause(View v){Intent intent=new Intent(this,MusicService.class);intent.setAction(MusicService.ACTION_PAUSE);startService(intent);}public void exit(View v){Intent intent=new Intent(this,MusicService.class);intent.setAction(MusicService.ACTION_EXIT);startService(intent);}
}



作为前台服务运行

@TargetApi(Build.VERSION_CODES.O)private void notification() {String id ="channel_1";//channel的idString description = "123";//channel的描述信息int importance = NotificationManager.IMPORTANCE_LOW;//channel的重要性NotificationChannel channel = new NotificationChannel(id, "123", importance);//生成channelNotification.Builder builder=new Notification.Builder(this,id);builder.setTicker("我的第一个音乐播放器");builder.setSmallIcon(R.mipmap.ic_launcher);builder.setContentTitle("我的音乐播放器");builder.setContentInfo("正在播放");PendingIntent pi=PendingIntent.getActivity(this,0,new Intent(this,Main3Activity.class),PendingIntent.FLAG_UPDATE_CURRENT);builder.setContentIntent(pi);NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);nm.createNotificationChannel(channel);Notification notification=builder.build();startForeground(0,notification);nm.notify(0,notification);}



注意,在sdk版本为25或25之前想在notification中添加一个点击事件 只要通过setContentIntent()传入一个PendingIntent就可以实现通知点击事件。但是26之后引入了一个叫NotificationChannel的类 在sdk版本为26的时候 我们不加这个东西 就设置用不了点击事件啦
具体分析参考博客:解决Fail to post notification on channel "null"的方法
从ContentResolver获取媒体内容
查询音乐列表

public void queryMusic(View v){ContentResolver cr=getContentResolver();Cursor c= cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null);if(c!=null){while (c.moveToNext()){String url= c.getString(c.getColumnIndex(MediaStore.Audio.Media.DATA));String songName= c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));String artist= c.getString(c.getColumnIndex(MediaStore.Audio.Media.ARTIST));System.out.println("路径:"+url);System.out.println("歌名:"+songName);System.out.println("歌手:"+artist);System.out.println("---------------------");}}

安卓学习日记——媒体播放相关推荐

  1. 安卓学习日记——画布与绘制

    先提一下Draw 9-patch 老版本的Android Studio是在SDK目录下的Tools里有个draw9patch 新版Android Studio是可以在AS里直接创建的(一开始没在目录下 ...

  2. 安卓学习日记:初识Android Studio · java环境配置和AS安装

    工欲善其事,必先利其器.要进行安卓开发,必须要有一款上手的开发利器.查阅了相关资料后,了解到,现在主流的安卓开发工具是: 1. Eclipse + Android SDK 2. Android Stu ...

  3. 安卓学习日记——Shortcut

    Shortcuts初体验 好了, 在我们开始撸码之前, 还是来看看这个新特性有多赞, 新系统中好多google家的APP都集成了这项功能, 所以, 我们先挑个APP来体验一下. 长按会发现有个快捷打开 ...

  4. 安卓学习日记——Vitamio框架

    Vitamio中文名称"维他蜜",是一款Android与IOS平台上的全能多媒体开发框架,全面支持硬件解码与GPU渲染.Vitamio能够流程播放720P甚至1080P高清MKV, ...

  5. 安卓学习日记(一):了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)

    首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层.系统运行库层.应用框架层和应用层,那就先说说这几层. 1.linux内核层: Andr ...

  6. 安卓学习日记——补间动画与帧动画

    Animation介绍 Android提供了几种动画类型:View Animation.Drawable Animation.Property Animation.View Animation相当简单 ...

  7. 安卓学习日记——在线支付

    Pingxx 官网:https://www.pingxx.com/ 服务器端和客户端的配置参考官方的文档 客户端代码 package com.example.pingxx;import android ...

  8. 安卓学习日记——广告

    万普积分墙 去万普官网,注册账号,登录(www.waps.cn) 下载SKD,导包 添加权限 <uses-permission android:name="android.permis ...

  9. 安卓学习日记——APP共享内容

    分享简单的文本内容 public void sharedSimpleContentClick(View v){Intent intent=new Intent();intent.setAction(I ...

最新文章

  1. python 形参 拷贝_Day124:python中的变量、引用、拷贝
  2. Jenkins安装目录说明
  3. i2c--insmod
  4. 真实项目中 ThreadLocal 的妙用
  5. java 递归 堆栈_Java中的堆栈安全递归
  6. sublime text常用快捷键整理
  7. hbase权限管理(访问控制标签ACL)
  8. 一个关于C++ Inline关键字的引发的一个错误
  9. 数据结构-----栈+中缀表达式(计算器)
  10. win10任务栏全透明
  11. android mp4 画面裁剪,说说Android的视频裁剪(三)
  12. 怎样夸学计算机的人,学学古人是怎样夸人有才的
  13. C# 对目录中的文件名按照数字序号进行排序
  14. 微信HOOK 3.4.5.27 CALL信息留根-2021-12-27
  15. 秀米怎么用html模板,秀 米 模 板 不 够 用 ?
  16. 佳博pt380便携式小票打印机,win10安装
  17. 面试android开发工程师小结
  18. 电力系统卫星时钟同步(GPS北斗授时)组成及配置
  19. 【开源日记】宿舍断电自动关灯设备(一)
  20. GItHub频繁验证邮箱?Please verify your email address????

热门文章

  1. 【SWAT水文模型】SWAT水文模型建立及应用第三期:基于中国土壤数据库建立土壤库(待更新)
  2. c 语言 常用语句,c语言六种基本语句是什么
  3. get几个小技能:轮播图插件、进度条插件、筛选过滤插件
  4. 【Redis】过期淘汰策略以及内存淘汰机制
  5. 精彩回顾 | 2021世界人工智能大会圆满落幕,容智信息助力拓展企业数字生产力
  6. Java中的常量池(字符串常量池、class常量池和运行时常量池)
  7. multiset底层原理,红黑树原理
  8. 人工智能发展月报(2022年9月)
  9. java计算机毕业设计银杏湖景区旅游管理信息平台源码+系统+mysql数据库+lw文档
  10. 第二章 DMDSC集群搭建