Android开发学习之路--MediaPlayer之简单音乐播放器初体验
很多时候我们都会用手机来播放音乐,播放视频,那么具体地要怎么实现呢,其实主要是MediaPlayer类来完成的。下面通过简单的例子来实现一首歌曲的播放吧。新建工程MediaPlayerStudy,这里我们来简单地实现个音乐播放器,首先来简单布局下:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="0"
tools:context="com.example.jared.mediaplayerstudy.MainActivity"> <TableRow>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_gravity="center"
android:orientation="horizontal"> <TextView
android:id="@+id/musicName"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="22dp"
android:layout_gravity="center"
android:text="Music Player"/>
</LinearLayout>
</TableRow>
<TableRow>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:orientation="horizontal"> <TextView
android:id="@+id/playingTime"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="00:00"/>
<SeekBar
android:id="@+id/seek"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="1"
android:max="100"/>
<TextView
android:id="@+id/totalTime"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="00:00"/>
</LinearLayout>
</TableRow>
<TableRow>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:orientation="horizontal"> <Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="播放"/>
<Button
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="暂停"/>
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="停止"/>
</LinearLayout>
</TableRow>
</TableLayout>
效果如下所示:
package com.example.jared.mediaplayerstudy; import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private Button playMusic;
private Button pauseMusic;
private Button stopMusic; private TextView totalTime_text;
private TextView playingTime_text; private SeekBar playingProcess; private int totalTime = 0; private MediaPlayer mediaPlayer = new MediaPlayer(); private Handler hangler = new Handler();
private boolean flag=true; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); playMusic = (Button)findViewById(R.id.play);
playMusic.setOnClickListener(new myOnClickListener()); pauseMusic = (Button)findViewById(R.id.pause);
pauseMusic.setOnClickListener(new myOnClickListener()); playingProcess = (SeekBar)findViewById(R.id.seek);
playingProcess.setOnSeekBarChangeListener(new mySeekBarListener()); totalTime_text = (TextView)findViewById(R.id.totalTime);
playingTime_text = (TextView)findViewById(R.id.playingTime); initMediaPlayer();
} public void setTotalTime() {
totalTime = mediaPlayer.getDuration() / 1000;
Log.d("MediaPlayerTest", String.valueOf(totalTime));
String pos = String.valueOf(totalTime/60/10)+String.valueOf(totalTime/60%10)
+':'+String.valueOf(totalTime%60/10)+String.valueOf(totalTime%60%10);
totalTime_text.setText(pos);
playingProcess.setProgress(0);
playingProcess.setMax(totalTime);
} public void updateTimepos() {
int timepos = playingProcess.getProgress()+1;
if(timepos >= totalTime-1) {
timepos = 0;
flag = false;
}
playingProcess.setProgress(timepos);
String pos = String.valueOf(timepos/60/10)+String.valueOf(timepos/60%10)
+':'+String.valueOf(timepos%60/10)+String.valueOf(timepos%60%10);
playingTime_text.setText(pos); } public void initMediaPlayer() {
try {
String file_path = "/sdcard/qqmusic/song/daoxiang.mp3";
//File file = new File(Environment.getExternalStorageDirectory(), "music.mp3");
mediaPlayer.setDataSource(file_path);
mediaPlayer.prepare();
setTotalTime();
} catch (Exception e) {
e.printStackTrace();
}
} private void refreshTimepos() {
new Thread(new Runnable() {
@Override
public void run() {
while(flag && playingProcess.getProgress()<totalTime-1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
hangler.post(new Runnable() {
@Override
public void run() {
updateTimepos();
}
});
}
}
}).start();
} private class mySeekBarListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) { } @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo( playingProcess.getProgress()*1000);
updateTimepos();
}
} private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.play:
setPlayMusic();
break;
case R.id.pause:
setPauseMusic();
break;
}
}
} public void setPlayMusic() {
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
flag = true;
refreshTimepos();
}
} public void setPauseMusic() {
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
flag = false;
}
}
}
对于按键的监听就不多说了,这里还学了seekbar,seekbar的话其实和一般的也差不多。当seek的点改变的时候,那么就会调用onProgressChanged,当拖动的时候手指还没有弹起的时候调用onStartTrackingTouch,当拖动手指弹起的时候调用onStopSTrackingTouch。
Android开发学习之路--MediaPlayer之简单音乐播放器初体验的更多相关文章
- Android开发学习之路--UI之简单聊天界面
学了很多的ui的知识,这里就来实现个聊天的界面,首先来实现个layout的xml,代码如下: <?xml version="1.0" encoding="utf-8 ...
- Android开发学习之路--RxAndroid之简单原理
学习了RxAndroid,其实也就是RxJava了,但是还是不是非常清楚到底RxAndroid有什么用呢?为什么要使用RxAndroid呢?这篇文章讲得不错,RxJava的原理.但是这里还是把整个 ...
- Web开发学习之路--Eclipse+Tomcat+mysql之初体验
学习了一段时间android,正好要用到android和服务器之间的交互,既然要学习android,那么就涉猎下服务器端的开发了,以前学过php,用thinkphp很快可以搭建起来,但是android ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
随机推荐
- solr6.6初探之solrj
一. solrj简介: solrj可以使Java应用程序很方便的访问与操作solr.solrj有几个核心类,分别为:1.SolrClient 2.SolrRequests 3.SolrQuerys 4 ...
- JavaScript和DOM
body { margin: 0 } .left { float: left } .right { float: right } .pg-head { height: 48px; background ...
- jquery 跨域请求数据问题
昨天参加了一个前端的面试,被问到一个跨域请求数据问题,我们之前一直用的是apicloud的api进行请求的,跨域是被apicloud封装起来的,也就没有注意跨域请求数据的问题.当被问到用jquery跨 ...
- JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...
- 【给你一个承诺 - 玩转 AngularJS 的 Promise】
了解Promise 在谈论Promise之前我们要了解一下一些额外的知识:我们知道JavaScript语言的执行环境是"单线程",所谓单线程,就是一次只能够执行一个任务,如果有多个 ...
- eclipse安装和配置Gradle插件
配置: 首先下载Gradle:https://gradle.org/gradle-download/ 设置Gradle环境变量: GRADLE_HOME %GRADLE_HOME%\bin" ...
- Jupyter Notebook 快速入门
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特性,以 ...
- C++格式化输出浮点数
主要内容 介绍C++中如何格式化输出浮点数. 控制浮点数输出格式需要包含iomanip头文件. 使用fixed来控制输出的浮点数的小数位是固定的.可参考http://en.cppreference.c ...
- 【Java集合系列】---总体框架
个的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作,一般来说,这些数据项的类型都是相同的,或者基类相同(若使用的语言支持继承),列表或数组通常不认为是集合,因为其大小固定,但是事实上 ...
- 六星经典CSAPP-笔记(3)程序的机器级表示
1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个 ...