【总结】关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结
在使用音频时,需要用到MediaPlayer,除了一些基础的方法之外,比较难掌握的就是设计播放点的调转的地方,进过反复调试,我最终找到一个可以让getCurrentPosition()和seekTo(int)发挥作用的方法。
一、 布局代码如下:
<RelativeLayout 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"
tools:context=".MainActivity" > <RelativeLayout android:id="@+id/adcontainer"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_alignParentTop="true">
</RelativeLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play"
android:id="@+id/play"
android:layout_alignParentTop="true"
/>
<EditText
android:id="@+id/seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/play"
android:layout_alignParentLeft="true"
android:textColor="#ff000000"
android:ems="7"
android:hint=""
/>
<Button
android:id="@+id/go"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/seek"
android:text="@string/go"
/>
<TextView
android:layout_below="@+id/seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:id="@+id/text"
/> </RelativeLayout>
上述布局主要有以下几个部件:“播放/停止”按钮Play,“调整”按钮Go,跳转时间(毫秒)输入框,相关提示信息显示界面。
二、MainActivity代码
package com.kavinapps.androidk.audio; import java.io.IOException; import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity { private static final String TAG = "AudioPlayActivity";
private MediaPlayer mMediaPlayer;//定义音频控件
private int mPosition;//记录音频文件播放的位置
private TextView mTextView;
private EditText mEditText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("音频测试V0.0.3"); mTextView = (TextView)findViewById(R.id.text);
mEditText = (EditText)findViewById(R.id.seek); mMediaPlayer = new MediaPlayer();
mMediaPlayer = MediaPlayer.create(this, R.raw.music);//将音频文件放到里面
mMediaPlayer.setLooping(false);//不循环播放 mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
//mMediaPlayer.seekTo(mPosition);
mTextView.setText("开始处:" + mPosition +'\r'+'\n');
mEditText.setInputType(InputType.TYPE_CLASS_NUMBER);//输入类型为数字 Button playButton = (Button)this.findViewById(R.id.play);
Button goButton = (Button)this.findViewById(R.id.go);
ButtonClickListener listener = new ButtonClickListener();//定义按键监听器
playButton.setOnClickListener(listener);
goButton.setOnClickListener(listener); } private final class ButtonClickListener implements View.OnClickListener{ @Override
public void onClick(View v) {
// TODO Auto-generated method stub Button button = (Button) v;//得到button
try{
switch(v.getId()){//通过传过来的button,可以判断button的类型
case R.id.play://播放
if(mMediaPlayer.isPlaying()){
stop();
mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
mTextView.setText(mTextView.getText()+"段落:" + mPosition +'\r'+'\n');
}else{
play();
}
break;
case R.id.go://进入预设的时间
play();//必须先用play()初始化,不然会有错误产生,而是也无法调到设定的时间
stop();
Log.i(TAG,"按下Go键");
Log.i(TAG,"设定的跳转位置是mPosition= "+mPosition);
mTextView.setText(mTextView.getText()+"设定点:" +(mEditText.getText().toString()) +'\r'+'\n');
mMediaPlayer.seekTo(Integer.parseInt((mEditText.getText().toString())));
//mMediaPlayer.seekTo(mPosition);
//mMediaPlayer.seekTo(30000);//调到30s
Log.i(TAG,"跳转到的位置是mPosition= "+mMediaPlayer.getCurrentPosition());
play();
}
}catch (Exception e){
Log.e(TAG,e.toString());
}
}
}
private void play() throws IOException{ //此过程可能抛出异常
// TODO Auto-generated method stub
mMediaPlayer.start();//播放
}
private void stop() throws IOException{ //此过程可能抛出异常
// TODO Auto-generated method stub
mMediaPlayer.pause();
}
//关于播放位置的确定
/*
* mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
* mMediaPlay.seekTo(mPosition);
* */ @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
///getMenuInflater().inflate(R.menu.activity_main, menu);
///return true;
super.onCreateOptionsMenu(menu);
Log.i(TAG,"创建菜单");
menu.add(0,1,1,"播放音频");
menu.add(0,2,2,"目录"); return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
super.onPrepareOptionsMenu(menu);
Log.i(TAG,"准备菜单");
menu.clear();
if(mMediaPlayer.isPlaying()){
menu.add(0,1,1,"暂停音频");
menu.add(0,2,2,"目录");
}else{
menu.add(0,1,1,"播放音频");
menu.add(0,2,2,"目录1");
} return true; }
@Override
public boolean onOptionsItemSelected(MenuItem item){
if(item.getItemId() == 1){ //选择“播放音频”
Log.i(TAG,"菜单选择");
try{
//Log.i(TAG,mMediaPlayer.isPlaying()+"");
if(mMediaPlayer.isPlaying()){
stop();
Log.i(TAG,"菜单选择");
}else
play(); }catch (Exception e){
Log.e(TAG,e.toString());
} }else if(item.getItemId() == 2){ //选择“目录” }
return false;
} @Override
protected void onDestroy(){
mMediaPlayer.release();
super.onDestroy();
Log.i(TAG,"OnDestroy");
} }
上述程序成功的关键是下面的一点:
(1)确保在进行音频调转seekTo(int)或者stop()之前,要确保之前已经进行过play(),不然会报错;
三、应用截图
【总结】关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结的更多相关文章
- Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程
转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...
- C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
- MySQL中你肯定不知道的int隐情
MySQL中定义id字段为int类型,但是你知道它内部是什么玩意吗? 1.如果定义int类型,但是不声明长度,系统默认为11个长度(这个大家都知道): 2.如果指定长度小于11,实际上系统还是默认为1 ...
- Java中List、integer[]、int[]之间的转化
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...
- 谈谈Java中整数类型(short int long)的存储方式
在java中的整数类型有四种,分别是byte short in long,本文重点给大家介绍java中的整数类型(short int long),由于byte只是一个字节0或1,在此就不多说了,对ja ...
- Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题
在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...
- 在C\C++中char 、short 、int各占多少个字节
在C\C++中char .short .int各占多少个字节 : #include <bits/stdc++.h> using namespace std; int main() { co ...
- java中整数的默认为int类型的一些问题
thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...
- java 基础--8 种基本数据类型:整型、浮点型、布尔型、字符型 整型中 byte、short、int、long 的取值范围 什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额?
一.8种基本数据类型(4整,2浮,1符,1布): 整型:byte(最小的数据类型).short(短整型).int(整型).long(长整型): 浮点型:float(浮点型).double(双精度浮点 ...
随机推荐
- linux学习笔记-9.查找
1.查找可执行的命令 which ls 2.查找可执行的命令和帮助的位置 whereis ls 3.查找文件(需要更新库:updatedb) locate hadoop.txt 4.从某个文件夹开始查 ...
- Nuxt.js 学习笔记
起源 最主要的原因时使用vue-cli搭建的SPA(单页应用)不利于搜索引擎的SEO操作.搜索引擎对SPA的抓取并不好,特别是百度根本没法抓取到SPA的内容页面,所以我们必须把我们的应用在服务端渲染成 ...
- Android-Start方式和Bind方式混合开启Service
Android-Start方式和Bind方式混合开启Service 需求如下 需要开发一个音乐APP,需要满足以下的需求: 当退出所有的Activity后仍然能够播放音乐 能够控制音乐的播放比如说,暂 ...
- Android - Base64
Android 将图片转换为Base64 public void convertToBase64(View view) throws IOException { //获取ImageView的图片 Bi ...
- bootstrap css-网格系统
前言:第一次记录点东西,只能勉强算是笔记吧.博主自学前端,深知自己水水的,但还是向把自己学到的东西记录下来,这不刚学习了bootstrap的css部分,现在整理出笔记. 1,Bootstrap网格系统 ...
- curl请求指定host ip(指定域名解析的内网某ip)
域名www.test.com解析内部多台ip $httpHeader = array('Host: www.test.com');$url = "10.17.2.245/xxx/xxx/t. ...
- canvas知识点积累
fillRect(x,y,width,height) 填充一个矩形区域,绘制已填色的矩形,默认填充颜色为黑色.x:矩形左上横坐标,y:矩形左上纵坐标,width:矩形宽度,height:矩形高度. s ...
- PHP之PDO_MYSQL扩展安装步骤(转)
看到CakePHP文档要求安装pdo_mysql扩展,于是就尝试安装了一下. 这里我的系统是CentOS 6.0.如果你的系统是其他版本的Linux/Unix,可以参考.如果你的系统是Windows的 ...
- 在Eclipse添加Android兼容包( v4、v7 appcompat )(转)
昨天添加Android兼容包,碰到了很多问题,在这里记录一下,让后面的路好走. 如何选择兼容包, 请参考Android Support Library Features(二) 一.下载Support ...
- 在ASP.NET MVC实现购物车,尝试一种不同于平常的购物车显示方式
通常,我们看到的购物车是这样的: 虽然这种购物车显示方式被广泛运用,但我个人觉得不够直观.如果换成这样呢? 本篇的源码放在了:https://github.com/darrenji/ShoppingC ...