【总结】关于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(双精度浮点 ...
随机推荐
- Django-ContentType-signals 实现牛逼玩法
一.ContentType 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的 ...
- 添加第一个控制器(Controllers)
在MVC体系架构中,输入请求是由控制器Controller来处理的(负责处理浏览器请求,并作出响应).在ASP.NET MVC中Controller本身是一个类(Class)通常继承于System.W ...
- KVM基于X86硬件辅助的虚拟化技术实现机制【转】
内存虚拟化 Shadow Paging 作者 Shawn 在其中文博客中很详尽地介绍了 KVM 在只支持一级分页的 x86 平台上用 “Shadow Paging”进行 MMU 虚拟化的实现,由于目前 ...
- Maven 项目不打包 *.hbm.xml 映射文件
使用 Maven 部署 Java Web 项目时,Hibernate 的映射文件 *.hbm.xml 没有被打包部署到目标目录下,解决方法:在 pom.xml 文件中 <build> 节点 ...
- Java常用加密方案及实现——AES和DES
AES和DES都是对称加密算法,其中DES全称为Data Encryption Standard,AES全称为Advanced Encryption Standard即高级加密标准. DES现在已经不 ...
- Linux下查看哪些IP登陆过系统/var/log/wtmp
last -f /var/log/wtmp
- 微信图片生成插件,页面截图插件 html2canvas,截图失真 问题的解决方案
html2canvas 是一个相当不错的 JavaScript 类库,它使用了 html5 和 css3 的一些新功能特性,实现了在客户端对网页进行截图的功能.html2canvas 通过获取页面的 ...
- Revit API过滤管道系统类型
管道只能通过PipeType过滤出来类型属性,只能是系统族的类型属性.管道实例过滤不能用族符号和族实例,要用Pipe using System; using System.Collections.Ge ...
- WiX: uninstall older version of the application
I have installer generated by WiX and I want it to ask: "You have already installed this app. D ...
- 在树莓派2上安装 Windows 10
微软在2015年4月29日发布了树莓派玩家期待已久的 Windows 10 物联网核心预览版(Windows 10 IoT Core Insider Preview Image for Raspber ...