注意:有些設備可能支持其餘的文件格式。 java
1.Audio android
AAC LC/LTP、HE-AACv1(AAC+)、AMR-NB、AMR-WB、MP三、MIDI、Ogg Vorbis、PCM/WAVE、FLAC(3.1或3.1以上) 網絡
2.Image 框架
JPEG、PNG、WEBP、GIF、BMP 異步
3.Video ide
H.26三、H.264 AVC、MPEG-4 SP、VP8(2.3.3或2.3.3以上) oop
大體步驟:
1.初始化MediaPlayer,附上要播放的媒體。 this
2.準備播放 prepare url
3.開始播放 start .net
4.在播放結束前:中止或者暫停播放 pause or stop
5.播放完成 complete
android只支持有限數量的可同步的MediaPlayer,不釋放它們會致使運行時錯誤,因此當你完成播放的時候,記得:
mediaPlayer.release(); 來釋放所涉及的資源。
MediaPlayer能夠播放本地文件、Content Providers、遠程URL流。
加載:
// Load an audio resource from a package resource. MediaPlayer resourcePlayer = MediaPlayer.create(this, R.raw.my_audio); // Load an audio resource from a local file. MediaPlayer filePlayer = MediaPlayer.create(this, Uri.parse(「file:///sdcard/localfile.mp3」)); // Load an audio resource from an online resource. MediaPlayer urlPlayer = MediaPlayer.create(this, Uri.parse(「http://site.com/audio/audio.mp3」)); // Load an audio resource from a Content Provider. MediaPlayer contentPlayer = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI);
注意:上述這種create後返回mediaPlayer的方式,其實已經調用了prepare方法,因此不能再調用了。
涉及網絡的,記得加網絡權限。
方法2:
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(「/sdcard/mydopetunes.mp3」);
mediaPlayer.prepare();
與上面相似。
想要播放視頻,比播放音頻複雜許多。播放視頻你必須有一個surface來支持。
2種方式來播放視頻:
方法一:使用VideoView,內置了surface,經過MediaPlayer加載。
方法二:本身指定surface,直接操做底層的MediaPlayer。
播放視頻經過VideoView:
final VideoView videoView = (VideoView)findViewById(R.id.videoView); // Assign a local file to play videoView.setVideoPath(「/sdcard/mycatvideo.3gp」); // Assign a URL of a remote video stream videoView.setVideoUri(myAwesomeStreamingSource);
當Video被初始化後,你能夠控制它的播放經過使用start、stopPlayback、pause、seekTo方法。
VideoView還包含setKeepScreenOn方法,在播放中屏幕不鎖屏。
方法一:使用VideoView:
// Get a reference to the Video View. final VideoView videoView = (VideoView)findViewById(R.id.videoView); // Configure the video view and assign a source video. videoView.setKeepScreenOn(true); videoView.setVideoPath(「/sdcard/mycatvideo.3gp」); // Attach a Media Controller MediaController mediaController = new MediaController(this); videoView.setMediaController(mediaController);
方法二:利用surface
SurfaceHolder是異步建立的,因此你必須等surfaceCreated觸發後,你才能將Holder給mediaPlayer。
直接看框架代碼:
public class SurfaceViewVideoViewActivity extends Activity implements SurfaceHolder.Callback { static final String TAG = 「SurfaceViewVideoViewActivity」; private MediaPlayer mediaPlayer; public void surfaceCreated(SurfaceHolder holder) { try { // When the surface is created, assign it as the // display surface and assign and prepare a data // source. mediaPlayer.setDisplay(holder); mediaPlayer.setDataSource(「/sdcard/test2.3gp」); mediaPlayer.prepare(); } catch (IllegalArgumentException e) { Log.e(TAG, 「Illegal Argument Exception」, e); } catch (IllegalStateException e) { Log.e(TAG, 「Illegal State Exception「, e); } catch (SecurityException e) { Log.e(TAG, 「Security Exception「, e); } catch (IOException e) { Log.e(TAG, 「IO Exception「, e); } } public void surfaceDestroyed(SurfaceHolder holder) { mediaPlayer.release(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.surfaceviewvideoviewer); // Create a new Media Player. mediaPlayer = new MediaPlayer(); // Get a reference to the Surface View. final SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceView); // Configure the Surface View. surfaceView.setKeepScreenOn(true); // Configure the Surface Holder and register the callback. SurfaceHolder holder = surfaceView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300); // Connect a play button. Button playButton = (Button)findViewById(R.id.buttonPlay); playButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mediaPlayer.start(); } }); // Connect a pause button. Button pauseButton = (Button)findViewById(R.id.buttonPause); pauseButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mediaPlayer.pause(); } }); // Add a skip button. Button skipButton = (Button)findViewById(R.id.buttonSkip); skipButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mediaPlayer.seekTo(mediaPlayer.getDuration()/2); } }); } }
mediaPlayer.start()後就開始播放。 getDuration方法得到播放的長度,getCurrentPosition找到當前播放到的位置。使用seekTo方法跳到指定的位置。
去確保一致的體驗,Android提供了MediaController-一個標準的提供經常使用的Media控制按鈕,就像:
你若想使用MediaController去控制播放,最好在代碼中實例化它。當你這麼作了,MediaController只會在你設置它爲visible以後或者觸摸它的Video View,或者與其交互。
若是你使用VideoView去顯示你的視頻內容,你能夠簡單得經過VideoView的setMediaController方法:
// Attach a Media Controller MediaController mediaController = new MediaController(this); videoView.setMediaController(mediaController);
去控制一個MediaPlayer,你須要去實現一個新的MediaController.MediaPlayerControl:
MediaController mediaController = new MediaController(this); mediaController.setMediaPlayer(new MediaPlayerControl() { public boolean canPause() { return true; } public boolean canSeekBackward() { return true; } public boolean canSeekForward() { return true; } public int getBufferPercentage() { return 0; } public int getCurrentPosition() { return mediaPlayer.getCurrentPosition(); } public int getDuration() { return mediaPlayer.getDuration(); } public boolean isPlaying() { return mediaPlayer.isPlaying(); } public void pause() { mediaPlayer.pause(); } public void seekTo(int pos) { mediaPlayer.seekTo(pos); } public void start() { mediaPlayer.start(); } });
使用setAnchorView方法去決定MediaController依附在哪一個View上,這個View能夠是任意View。
調用show或者hide來顯示或者隱藏。
mediaController.setAnchorView(myView); mediaController.show();
MediaPlayer提供方法去控制音量、鎖屏亮度、設置循環模式。
控制音量經過setVolume方法。
mediaPlayer.setVolume(0.5f, 0.5f); 值在0-1之間浮點數,0表示靜音,1表示最大音量。 2個參數分別表明左聲道和右聲道。
mediaPlayer.setScreenOnWhilePlaying(true); //播放時,屏幕不鎖屏。 if (!mediaPlayer.isLooping()) mediaPlayer.setLooping(true);
有些設備,附上了耳機,或者藍牙耳機,會提供播放、暫停、skip、上一個播放的 按鍵。
你能夠監聽Action爲:android.intent.action.MEDIA_BUTTON。
public class MediaControlReceiver extends BroadcastReceiver { public static final String ACTION_MEDIA_BUTTON = 「com.paad.ACTION_MEDIA_BUTTON」; @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { Intent internalIntent = new Intent(ACTION_MEDIA_BUTTON); internalIntent.putExtras(intent.getExtras()); context.sendBroadcast(internalIntent); } } } public class ActivityMediaControlReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (MediaControlReceiver.ACTION_MEDIA_BUTTON.equals( intent.getAction())) { KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); switch (event.getKeyCode()) { case (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) : if (mediaPlayer.isPlaying()) pause(); else play(); break; case (KeyEvent.KEYCODE_MEDIA_PLAY) : play(); break; case (KeyEvent.KEYCODE_MEDIA_PAUSE) : pause(); break; case (KeyEvent.KEYCODE_MEDIA_NEXT) : skip(); break; case (KeyEvent.KEYCODE_MEDIA_PREVIOUS) : previous(); break; case (KeyEvent.KEYCODE_MEDIA_STOP) : stop(); break; default: break; } } } }
AudioManager的registMediaButtonEventReceiver方法去註冊接受者,能夠防止其餘APP也在監聽ACTION。
// Register the Media Button Event Receiver to // listen for media button presses. AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); ComponentName component = new ComponentName(this, MediaControlReceiver.class); am.registerMediaButtonEventReceiver(component); // Register a local Intent Receiver that receives media button // presses from the Receiver registered in the manifest. activityMediaControlReceiver = new ActivityMediaControlReceiver(); IntentFilter filter = new IntentFilter(MediaControlReceiver.ACTION_MEDIA_BUTTON); registerReceiver(activityMediaControlReceiver, filter);