正常,使用mediaplayer时,当你插入任何可移动设备,mediaplayer都会自动搜索移动设备内的音频、视频文件,并且会自动播放,所以不能安全移除是很正常的。打开mediaplayer,可以到里面设置找找,看看有没有取消同步。
U盘不能安全移除的解决方法:关闭mediaplayer,刷新,然后安全移除U盘,如果还是不能安全移除,可以开始/注销,这样就能安全移除了。
安卓MediaPlayer 怎么实现一个文件的重新播放
Android的MediaPlayer包含了Audio和video的播放功能关于MediaPlayer的使用方式: 1. 如何获得MediaPlayer实例:可以使用直接new的方式:MediaPlayer mp = new MediaPlayer();也可以使用create的方式,如:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了2.如何设置要播放的文件:MediaPlayer要播放的文件主要包括3个来源:a. 用户在应用中事先自带的resource资源例如:MediaPlayer.create(this, R.raw.test);b. 存储在SD卡或其他文件路径下的媒体文件例如:mp.setDataSource("/sdcard/test.mp3");c. 网络上的媒体文件例如:mp.setDataSource("mp3或者mp4的地址");3.MediaPlayer常用APIMediaPlayer的setDataSource一共四个方法:setDataSource (String path) setDataSource (FileDescriptor fd) setDataSource (Context context, Uri uri) setDataSource (FileDescriptor fd, long offset, long length)4.对播放器的主要控制方法:Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:1.prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。2. start()是真正启动文件播放的方法。
3.pause()和stop()比较简单,起到暂停和停止播放的作用。
4.seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。5.release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。6.reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。
mediaplayer android 怎么播放网络音乐
首先打开我们下载安装好的Android Studio然后我们写入布局代码,三个按钮用来播放,停止,暂停<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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:text="音频播放器" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/textView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" android:id="@+id/button" android:layout_weight="0.33" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" android:id="@+id/button2" android:layout_weight="0.33" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停" android:id="@+id/button3" android:layout_weight="0.33" /> </LinearLayout></RelativeLayout>然后在res目录下面添加raw文件夹下面添加my.mp3文件然后我们在添加后台如下代码后台代码package com.basillee.asus.demo;import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import java.io.File;public class MainActivity extends Activity { private MediaPlayer mediaPlayer;//MediaPlayer对象 private boolean isPause=false;//是否暂停 private File file;//要播放的文件 private TextView hint;//声明提示信息的文本框 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取各功能按钮 final Button button=(Button)findViewById(R.id.button);//播放 final Button button1=(Button)findViewById(R.id.button2);//暂停 final Button button2=(Button)findViewById(R.id.button3);//停止 hint=(TextView)findViewById(R.id.textView); if(!isFileExist()){ button.setEnabled(false); } //对MediaPlayer对象添加事件监听,当播放完成时重新开始音乐播放 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { play(); } }); //对播放按钮进行事件监听 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { play(); if(isPause){ button1.setText("暂停"); isPause=false; } button1.setEnabled(true); button2.setEnabled(true); button.setEnabled(false); } }); //对暂停、继续按钮添加事件监听器 button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mediaPlayer.isPlaying()&&!isPause){ mediaPlayer.pause(); isPause=true; ((Button)v).setText("继续"); hint.setText("暂停播放音频...."); button.setEnabled(true); }else{ mediaPlayer.start(); ((Button)v).setText("暂停"); hint.setText("继续播放音频...."); button.setEnabled(false); } } }); //对停止按钮添加事件监听器 button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer.stop(); hint.setText("停止播放音频..."); button1.setEnabled(false); button2.setEnabled(false); button.setEnabled(true); } }); } @Override protected void onDestroy() { if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); } mediaPlayer.release(); super.onDestroy(); } //判断文件是否存在 private boolean isFileExist(){ file=new File(Environment.getExternalStorageDirectory()+File.separator+"myMP32.mp3"); if(file.exists()){ // mediaPlayer=new MediaPlayer(); mediaPlayer=MediaPlayer.create(this,R.raw.my); try {// mediaPlayer.setDataSource(file.getAbsolutePath());// mediaPlayer.prepare();//预加载音频// mediaPlayer.start();//播放音乐 }catch (Exception e) { e.printStackTrace(); } Toast.makeText(this,"file exist",Toast.LENGTH_LONG).show(); return true; }else{ Toast.makeText(this,"file don't exist",Toast.LENGTH_LONG).show(); } return false; } //播放音乐的方法 private void play(){ try{ mediaPlayer.reset();//从新设置要播放的音乐 // mediaPlayer.setDataSource(file.getAbsolutePath());// mediaPlayer.prepare();//预加载音频 mediaPlayer=MediaPlayer.create(this,R.raw.my); mediaPlayer.start();//播放音乐 hint.setText("Music is starting"); } catch (Exception e) { e.printStackTrace(); Log.e("err",e.getMessage()); } return ; }}主要是play方法然后我们运行虚拟机如下图所示:6然后我们运行此程序点击播放按钮就可以播放音乐了,其他按钮功能大家可以自己试试。
android mediaplayer能播放什么格式的文件
Android官方公布的文档显示MediaPlayer支持如下视频格式:Video H.263 X X 3GPP (.3gp) and MPEG-4 (.mp4)H.264 AVC X 3GPP (.3gp) and MPEG-4 (.mp4)MPEG-4 SP X 3GPP (.3gp)这些格式的视频,基本上属于手机支持的视频格式。如果想观看其他类型格式的视频,比如flv等,需要下载暴风、迅雷等播放器。
安卓 mediaplay 随机播放raw下的音乐文件?
播放RAW文件夹中的文件方法如下: 可以用ACDSee打开,在预览的RAW文件夹点击幻灯片即可播放。
其他支持RAW的专业软件还有如下几个: 1、使用佳能附的DPP软件。
2、Photoshop的camraRAW插件。 3、CORL的PANSHOP X2X3均可以打开。
安卓 能用mediarecorder和mediaplayer实现即时语音吗
android语音录制可以通过MediaRecorder和AudioRecorder。MediaRecorder本来是多媒体录制控件,可以同时录制视频和语音,当不指定视频源时就只录制语音;AudioRecorder只能录制语音。
二者录制的区别在于,MediaRecorder固定了语音的编码格式,具体平台支持类型可以在http://developer.android.com/guide/appendix/media-formats.html这里查看,而且使用时指定输出文件,在录制的同时系统将语音数据写入文件。
AudioRecorder输出的是pcm,即原始音频数据,使用者需要自己读取这些数据,这样的好处是可以根据需要边录制边对音频数据处理,读取的同时也可以保存到文件进行存储。语音的播放可以使用MediaPlayer和AudioTracker,与上面的对应,MediaPlayer可以播放各种多媒体文件,而AudioTracker只能播放pcm数据,使用者手动将数据连续写入进行播放。MediaRecorder的使用[java] view plain copy print?private void startRecording() { mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setOutputFile(mFileName); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (IOException e) { Log.e(LOG_TAG, "prepare() failed"); } mRecorder.start(); } AudioRecorder录制语音[java] view plain copy print?int suggestBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannelConfig, mAudioFormat); mAudioRecord = new AudioRecord(AudioSource.MIC, mSampleRate, mChannelConfig, mAudioFormat, suggestBufferSize); mAudioRecorder.startRecording(); byte[] inByteBuf = new byte[BUF_SIZE] while (runFlag) { int readSize = mAudioRecord.read(inByteBuf, 0, inByteBuf.length); } mAudioRecorder.stop(); mAudioRecord.release(); 上面是AudioRecorder的完整使用过程,AudioRecorder实例化的时候需要指定录音源、采样率等音频参数,最后一个是音频数据缓冲区大小,需要通过AudioRecord.getMinBufferSize()来得到缓冲区的最小值,如果实例化时参数小于这个最小值,那么AudioRecoder将创建失败。当然大于这个值肯定可以。
之后通过read将缓冲区的数据读出来。之前一直以为读取时使用的byte数组大小必须和缓冲区的大小一致,但实际并不是这样,看下AudioRecorder构造函数中对bufferSizeInBytes的解释:bufferSizeInBytes the total size (in bytes) of the buffer where audio data is written to during the recording. New audio data can be read from this buffer in smaller chunks than this size.也就是说缓冲区只是系统用来临时存放音频数据的,读取时可以每次读取较小的块,然后多次读取。AudioRecorder还有一个方法setPositionNotificationPeriod (int periodInFrames)。
这个方法可以在读取指定数据后发出一个回调,需要配合setRecordPositionUpdateListener (AudioRecord.OnRecordPositionUpdateListener listener),当读取的总数据是指定的periodInFrames的整数倍时就会调用listner的方法onPeriodicNotification.[java] view plain copy print?new OnRecordPositionUpdateListener() { @Override public void onPeriodicNotification(AudioRecord recorder) { // TODO Auto-generated method stub } @Override public void onMarkerReached(AudioRecord recorder) { // TODO Auto-generated method stub } }; 这个特性使用时有个注意点,就是回调只会发生在实际数据读取之后,也就是使用者通过read方法读取出periodInFrames这么多数据时才会触发这个回调,否则什么也不会发生。MeidaPlayer播放音频文件[java] view plain copy print?MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start(); mediaPlayer.stop(); mediaPlayer.release(); 其中setDataSource()有多个覆写,如下void setDataSource(String path)Sets the data source (file-path or http/rtsp URL) to use.void setDataSource(Context context, Uri uri, Map<String, String> headers)Sets the data source as a content Uri.void setDataSource(Context context, Uri uri)Sets the data source as a content Uri.void setDataSource(FileDescriptor fd, long offset, long length)Sets the data source (FileDescriptor) to use.void setDataSource(FileDescriptor fd)Sets the data source (FileDescriptor) to use.可以看到不同的输入参数指定了数据的来源。其中setDataSource(FileDescriptor fd, long offset, long length)可以指定开始读取的偏移量和长度。
之所以会注意到这个参数是因为在实际使用时有一个需求,即可以播放WAV文件,又可以播放MP3文件,而且能够限定播放开始和结束的位置。对于MP3文件使用setDataSource(FileDescriptor fd, long offset, long length)是完全可行的,像这样[java] view plain copy print?mPlayer.reset(); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mPlayer.setDataSource( new FileInputStream(mSoundFile.getFilePath()).getFD(), startByte, endByte - startByte); [java] view plain copy print?mPlayer.prepare(); 但WAV文件却完全没有效果,是什么原因呢,看下官方对setDataSource(FileDescriptor fd, long offset, long length)的解释Sets the data source (FileDescriptor) to use. The FileDescriptor must be seekable (N.B. a LocalSocket is not seekable). It is the caller's responsibility to close the file descriptor. It is safe to do so as soon as this call returns.注意到该方法指定的文件类型必须是seekable的,mp3文件属于这种类型(tips:不知道还有没有其他类型),因为mp3内部是按帧存储的,可以指定到具体的帧位置,而WAV文件音频数据是pcm,也就是一大片完整的数据,要对wav文件指定开始播放位置,需要使用另一个方法seekTo (int msec)。这里指定的参数是毫秒。
开始时间可以指定了,那结束播放的时间如何指定?MediaPlayer有另外两个方法:getDuration ()和getCurrentPosition (),这两个返回的都是时间信息,前者返回总的播放时间,后者返回当前播放位置的时间。那返回的结果对于mp3和wav是否会不同呢?会!对WAV类型,getDuration返回的是音频文件的总时间,getCurrentPosition返回的是从文件起始到现在的播放时间;而对mp3类型,getDuration返回的是startByte和endByte之间播放的时间间隔,getCurrentPosition返回从startByte到现在的播放时间。想一下原因也可以明白,因为MP3是可以精确指定起始位置的,所以所有计算都可以从指定的位置开始,而wav文件一切只能从最开始的位置计算。
留言评论