【总结】关于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(双精度浮点 ...
随机推荐
- 21.python中的闭包和装饰器
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...
- 【BZOJ-4212】神牛的养成计划 Trie树 + 可持久化Trie树
4212: 神牛的养成计划 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 136 Solved: 27[Submit][Status][Discus ...
- 利用ComponentWillReceiveProps解决异步问题
1.工作中遇到这么一个问题:有多个按钮,点击不同的按钮发送不同的请求(传的id不同)并显示弹窗,弹窗里要展示后端发送回来的数据.但是比如点击第二个按钮,弹窗里显示的仍然是第一个弹窗里的数据. 2.原因 ...
- [Deepin 15] sudo source /etc/profile 提示找不到 source 命令(切换到 root 用户:sudo su)
在 Deepin/Ubuntu 系统 中,因为修改了下 配置文件,然后执行 source 命令重新加载配置文件,结果: sudo source /etc/profile 提示找不到 source 命令 ...
- spanner-becoming-a-sql-system 2017
https://blog.acolyer.org/2017/07/03/spanner-becoming-a-sql-system/?utm_source=tuicool&utm_medium ...
- Windows Phone本地数据库(SQLCE):1、介绍(翻译)(转)
一只大菜鸟,最近要学习windows phone数据库相关的知识,找到了一些比较简短的教程进行学习,由于是英文的,顺便给翻译了.本身英语水平就不好,估计文中有不少错误,如果有不幸读到的童鞋请保持对翻译 ...
- Android 数据存储01之SharedPreferences
Android 数据存储01之SharedPreferences 版本 修改内容 日期 修改人 V1.0 原始版本 2013/2/20 skywang 1 SharedPreferences概括 Sh ...
- IOS NSLog 打印bool值
输出BOOL值的方法:NSLog(@"%@",YES?@"YES":@"NO");%@输出字符串. NSLog(@"ifReadO ...
- git推送tag到远端服务器
git推送tag到远端服务器 默认情况下,git push并不会把tag标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库.1.push单个tag,命令格式为:git push origi ...
- Tomcat服务器集群与负载均衡实现
一.前言 在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就有点显得有 点力不从心了.另外一个常见的问题是会产生单点 ...