文章目录

  • MediaPlayer类
    • 播放音频的实例
  • VideoView类
    • 播放视频的实例

MediaPlayer类

对多种格式的音频文件提供了全面的控制方法:

如何获得MediaPlayer实例?

  1. 通过构造函数
MediaPlayer mp = new MediaPlayer();
  1. 调用 MediaPlayer.create() 方法:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

由于 create 方法内会调用 setDataSourceprepare,因此后续无需再进行这两个的步骤:

如何设置要播放的文件?

MediaPlayer 要播放的文件主要包括3个来源:

  1. 应用中的 resource 资源:
// 放在程序res/raw目录下名为的test文件
MediaPlayer.create(this, R.raw.test);
  1. 存储在SD卡或其他文件路径下的媒体文件
// 通过Environment.getExternalStorageDirectory()获得sd卡路径
// mediaPlayer.setDataSource(Environment.getExternalStorageDirectory(), "music.mp3");
mp.setDataSource("/sdcard/test.mp3");
// 然后需要将MediaPlayer置为prepare状态
mp.prepare();
  1. 网络上的媒体文件,流程同上,只是 setDataSource 参数为网上资源的 Uri

重要的控制方法

  • seekTo(): 定位方法,该方法是个异步方法,返回时并不意味着定位完成,尤其是播放的网络文件。真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要可以调用 setOnSeekCompleteListener(OnSeekCompleteListener) 设置监听器来处理的。
  • prepareAsync() : 异步方式设置播放器进入 prepare 状态。

播放音频的实例

布局文件 audio_layout.xml

活动文件:

public class AudioActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "AudioActivity";private MediaPlayer mediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.audio_layout);Button button_play = findViewById(R.id.button_play);Button button_pause = findViewById(R.id.button_pause);Button button_stop = findViewById(R.id.button_stop);button_play.setOnClickListener(this);button_pause.setOnClickListener(this);button_stop.setOnClickListener(this);// 权限申请// 相等说明用户已授权,不等说明未授权if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){// 申请授权ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);} else {initMediaPlayer(); // 初始化MediaPlayer}}private void initMediaPlayer() {mediaPlayer = MediaPlayer.create(this, R.raw.shan_gui);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_play:if(!mediaPlayer.isPlaying()){mediaPlayer.start();Log.e(TAG, "点击play");}break;case  R.id.button_pause:if(mediaPlayer.isPlaying()){mediaPlayer.pause();Log.e(TAG, "点击pause");}break;case R.id.button_stop:if(mediaPlayer.isPlaying()){mediaPlayer.reset();// reset方法中会调用close、clear方法将MediaPlayer的资源进行清除// 因此需要重新初始化MediaPlayerinitMediaPlayer();Log.e(TAG, "点击stop");}break;}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {switch (requestCode){case 1:if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){initMediaPlayer();}else{Toast.makeText(this, "拒绝权限将无法使用程序", Toast.LENGTH_LONG).show();finish();}break;}}@Overrideprotected void onDestroy() {super.onDestroy();if(mediaPlayer != null){mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}}
}

VideoView类

常用方法有:

播放视频的实例

布局文件 video_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/button_vPlay"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="video play"/><Buttonandroid:id="@+id/button_vPause"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="video pause"/><Buttonandroid:id="@+id/button_vReplay"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="video replay"/></LinearLayout><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>
  • 三个按钮分别起到:播放、暂停、重置为视频开头的功能
  • VideoView 用以显示视频。

活动文件:

public class VideoActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "VideoActivity";private VideoView videoView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.video_layout);videoView = findViewById(R.id.video_view);Button button_vPlay = findViewById(R.id.button_vPlay);Button button_vPause = findViewById(R.id.button_vPause);Button button_vReplay = findViewById(R.id.button_vReplay);button_vPlay.setOnClickListener(this);button_vPause.setOnClickListener(this);button_vReplay.setOnClickListener(this);if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1);}else {initVideoPath(); // 初始化VideoViewLog.e(TAG, "onCreate: initVideoPath over");}}private void initVideoPath() {Uri uri = Uri.parse("android.resource://"+getPackageName()+ "/"+R.raw.qinqin);videoView.setVideoURI(uri);Log.e(TAG, "initVideoPath: "+uri);}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {switch (requestCode){case 1:if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){initVideoPath();}else{Toast.makeText(this, "拒绝授权则无法使用本APP", Toast.LENGTH_LONG).show();finish();}break;}}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_vPlay:if(!videoView.isPlaying()){videoView.start();}break;case R.id.button_vPause:if(videoView.isPlaying()){videoView.pause();}break;case R.id.button_vReplay:if(videoView.isPlaying()){videoView.resume();}break;}}@Overrideprotected void onDestroy() {super.onDestroy();if(videoView != null){videoView.suspend(); // 释放资源}}
}

Android开发(4) | 系统权限、MediaPlayer类 和 VideoView类 的应用——播放多媒体文件相关推荐

  1. android权限--android开发中的权限及含义(下)

    android权限--android开发中的权限及含义(下) android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权 ...

  2. Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题

    Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题 1.调用相机,兼容7.0 AndroidManifest配置 <providera ...

  3. 基于jeesite+android开发 电子商务系统免费教程

    下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...

  4. Android开发笔记(三十八)列表类视图

    AdapterView AdapterView顾名思义是适配器视图,Spinner.ListView和GridView都间接继承自AdapterView,这三个视图都存在多个元素并排展示的情况,所以需 ...

  5. Android开发--调用系统邮件

    Android系统的开源性使其在当前智能手机市场占据绝对优势,同时也产生了各种各样的机型和系统.这使得我们Android开发人员需要根据不同的机型和系统去做对应的适配. 正文 本篇所述需求为调用本地邮 ...

  6. android apk获取权限,Android apk 获取系统权限的方式

    Android系统中,权限等级分为 ["normal" | "dangerous"| "signature" | "signatu ...

  7. Android开发笔记(四十八)Thread类实现多线程

    Thread概述 Thread类是真正的线程,查看源码可见Thread也实现了Runnable接口,但它内部有创建新的工作线程,所以Thread对象运行在与主线程不一样的分线程上. 因为Thread对 ...

  8. Android开发笔记(三十六)展示类控件

    View/ViewGroup View是单个视图,所有的控件类都是从它派生出来:而ViewGroup是个视图组织,所有的布局视图类都是从它派生出来.由于View和ViewGroup是基类,因此很少会直 ...

  9. android 生成带有系统权限的apk

    如果你需要开发一个带有系统权限的app 首先需要配置sharedUserId     如图 如果现在直接运行程序 是安装不上的  需要先把程序打包  然后把需要的文件跟打包好的app放在同一个文件夹下 ...

最新文章

  1. 英语写作学习笔录 task1 body
  2. html外链式css运行不出来div,html+css外链式
  3. 2017吉首大学新生赛
  4. Windows 计划任务功能设置闹钟~
  5. HotSpot的-XshowSettings标志的简单性和价值
  6. java实现线程的方式_java多线程实现的四种方式
  7. VB2005.Net 环境下使用Jmail组件发送邮件
  8. sharepoint 2013基于AD的Form表单登录(三)——选择用户时,屏蔽掉AD。
  9. Pull or Push?监控系统如何选型
  10. Qt学习: QFileDialog和QMessageBox的用法和程序示例
  11. python 代码段的标志_Python代码类型标志
  12. AngularJS 简介
  13. Android一些关于分辨率和布局的设置
  14. 如何根据iframe内嵌页面调整iframe高宽续篇
  15. java配置环境变量无效
  16. 自制电吉他效果器 DIY PCB(三)原理图与封装 上
  17. 你知道黑体、仿宋、楷体、宋体、微软雅黑、新宋体也是有版权的吗?是否还能用?
  18. pca人脸特征降维的过程理解及matlab编程实现
  19. 文明5 java 英_文明5模组“Future Worlds”(未来世界)中英版补丁
  20. PAMTRI:用于车辆重新识别的姿势感知多任务学习

热门文章

  1. c++ 结构体初始化_STM32入门系列-使用库函数点亮LED,LED初始化函数
  2. textarea如何在文字后面_FLASH如何制作风吹文字的效果
  3. hbase java admin_java连接hbase(一):Admin功能接口表管理
  4. UE4异步编程专题 - 线程池FQueuedThreadPool
  5. asterisk1.8启动信息分析(未完)
  6. PJSIP UA分析(1)--PJSUA主函数
  7. linux-2.6.32.2内核在mini2440上的移植,Linux2.6.32.2移植到Mini2440
  8. vue 搜索框header_vue项目header模块编写
  9. 使用 rqt_console 和 roslaunch
  10. Spark-自定义累加器-进行字符串拼接(代码及详细实现步骤)