Android 4.0.3(Api Level 15)支持的多媒体格式。

注意:有些设备可能支持其他的文件格式。

1.Audio

AAC LC/LTP、HE-AACv1(AAC+)、AMR-NB、AMR-WB、MP3、MIDI、Ogg Vorbis、PCM/WAVE、FLAC(3.1或3.1以上)

2.Image

JPEG、PNG、WEBP、GIF、BMP

3.Video

H.263、H.264 AVC、MPEG-4 SP、VP8(2.3.3或2.3.3以上)

播放音频、视频主要由MediaPlayer类来控制。

大致步骤:
1.初始化MediaPlayer,附上要播放的媒体。

2.准备播放 prepare

3.开始播放 start

4.在播放结束前:停止或者暂停播放 pause or stop

5.播放完成 complete

android只支持有限数量的可同步的MediaPlayer,不释放它们会导致运行时错误,所以当你完成播放的时候,记得:

mediaPlayer.release(); 来释放所涉及的资源。

Prepare音频

MediaPlayer可以播放本地文件、Content Providers、远程URL流。

加载:

01 // Load an audio resource from a package resource.
02 MediaPlayer resourcePlayer =
03    MediaPlayer.create(this, R.raw.my_audio);
04  
05 // Load an audio resource from a local file.
06 MediaPlayer filePlayer = MediaPlayer.create(this,
07    Uri.parse(“file:///sdcard/localfile.mp3”));
08  
09 // Load an audio resource from an online resource.
10 MediaPlayer urlPlayer = MediaPlayer.create(this,
11    Uri.parse(“http://site.com/audio/audio.mp3”));
12  
13 // Load an audio resource from a Content Provider.
14 MediaPlayer contentPlayer = MediaPlayer.create(this,
15    Settings.System.DEFAULT_RINGTONE_URI);

注意:上述这种create后返回mediaPlayer的方式,其实已经调用了prepare方法,所以不能再调用了。

涉及网络的,记得加网络权限。

方法2:

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(“/sdcard/mydopetunes.mp3”);
mediaPlayer.prepare();

与上面类似。

Prepare视频

想要播放视频,比播放音频复杂许多。播放视频你必须有一个surface来支持。

2种方式来播放视频:

方法一:使用VideoView,内置了surface,通过MediaPlayer加载。

方法二:自己指定surface,直接操作底层的MediaPlayer。

播放视频通过VideoView:

1 final VideoView videoView = (VideoView)findViewById(R.id.videoView);
2  
3 // Assign a local file to play
4 videoView.setVideoPath(“/sdcard/mycatvideo.3gp”);
5  
6 // Assign a URL of a remote video stream
7 videoView.setVideoUri(myAwesomeStreamingSource);

当Video被初始化后,你可以控制它的播放通过使用start、stopPlayback、pause、seekTo方法。

VideoView还包含setKeepScreenOn方法,在播放中屏幕不锁屏。

方法一:使用VideoView:

01 // Get a reference to the Video View.
02 final VideoView videoView = (VideoView)findViewById(R.id.videoView);
03  
04 // Configure the video view and assign a source video.
05 videoView.setKeepScreenOn(true);
06 videoView.setVideoPath(“/sdcard/mycatvideo.3gp”);
07  
08 // Attach a Media Controller
09 MediaController mediaController = new MediaController(this);
10 videoView.setMediaController(mediaController);

方法二:利用surface

SurfaceHolder是异步创建的,所以你必须等surfaceCreated触发后,你才能将Holder给mediaPlayer。

直接看框架代码:

01 public class SurfaceViewVideoViewActivity extends Activity
02   implements SurfaceHolder.Callback {
03  
04   static final String TAG = “SurfaceViewVideoViewActivity”;
05  
06   private MediaPlayer mediaPlayer;
07  
08   public void surfaceCreated(SurfaceHolder holder) {
09      try
10     // When the surface is created, assign it as the
11     // display surface and assign and prepare a data
12     // source.
13     mediaPlayer.setDisplay(holder);
14     mediaPlayer.setDataSource(“/sdcard/test2.3gp”);
15     mediaPlayer.prepare();
16   } catch (IllegalArgumentException e) {
17     Log.e(TAG, “Illegal Argument Exception”, e);
18   } catch (IllegalStateException e) {
19     Log.e(TAG, “Illegal State Exception“, e);
20   } catch (SecurityException e) {
21     Log.e(TAG, “Security Exception“, e);
22   } catch (IOException e) {
23     Log.e(TAG, “IO Exception“, e);
24   }
25 }
26  
27 public void surfaceDestroyed(SurfaceHolder holder) {
28   mediaPlayer.release();
29 }
30  
31 public void surfaceChanged(SurfaceHolder holder,
32                                 int format, int width, int height) { }
33  
34 @Override
35 public void onCreate(Bundle savedInstanceState) {
36   super.onCreate(savedInstanceState);
37  
38   setContentView(R.layout.surfaceviewvideoviewer);
39  
40   // Create a new Media Player.
41   mediaPlayer = new MediaPlayer();
42  
43   // Get a reference to the Surface View.
44   final SurfaceView surfaceView =
45     (SurfaceView)findViewById(R.id.surfaceView);
46  
47   // Configure the Surface View.
48   surfaceView.setKeepScreenOn(true);
49  
50   // Configure the Surface Holder and register the callback.
51   SurfaceHolder holder = surfaceView.getHolder();
52   holder.addCallback(this);
53   holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
54   holder.setFixedSize(400, 300);
55  
56   // Connect a play button.
57   Button playButton = (Button)findViewById(R.id.buttonPlay);
58   playButton.setOnClickListener(new OnClickListener() {
59     public void onClick(View v) {
60        mediaPlayer.start();
61  
62        }
63     });
64  
65     // Connect a pause button.
66     Button pauseButton = (Button)findViewById(R.id.buttonPause);
67     pauseButton.setOnClickListener(new OnClickListener() {
68        public void onClick(View v) {
69          mediaPlayer.pause();
70        }
71     });
72  
73     // Add a skip button.
74     Button skipButton = (Button)findViewById(R.id.buttonSkip);
75     skipButton.setOnClickListener(new OnClickListener() {
76        public void onClick(View v) {
77          mediaPlayer.seekTo(mediaPlayer.getDuration()/2);
78        }
79     });
80   }
81 }

控制MediaPlayer的播放

mediaPlayer.start()后就开始播放。 getDuration方法获得播放的长度,getCurrentPosition找到当前播放到的位置。使用seekTo方法跳到指定的位置。

去确保一致的体验,Android提供了MediaController-一个标准的提供常用的Media控制按钮,就像:

你若想使用MediaController去控制播放,最好在代码中实例化它。当你这么做了,MediaController只会在你设置它为visible之后或者触摸它的Video View,或者与其交互。

如果你使用VideoView去显示你的视频内容,你可以简单得通过VideoViewsetMediaController方法:

1 // Attach a Media Controller
2 MediaController mediaController = new MediaController(this);
3 videoView.setMediaController(mediaController);

去控制一个MediaPlayer,你需要去实现一个新的MediaController.MediaPlayerControl

01 MediaController mediaController = new MediaController(this);
02 mediaController.setMediaPlayer(new MediaPlayerControl() {
03  
04    public boolean canPause() {
05      return true;
06    }
07  
08    public boolean canSeekBackward() {
09      return true;
10    }
11  
12    public boolean canSeekForward() {
13      return true;
14    }
15  
16    public int getBufferPercentage() {
17      return 0;
18    }
19  
20    public int getCurrentPosition() {
21      return mediaPlayer.getCurrentPosition();
22    }
23  
24    public int getDuration() {
25      return mediaPlayer.getDuration();
26    }
27  
28    public boolean isPlaying() {
29      return mediaPlayer.isPlaying();
30    }
31  
32    public void pause() {
33      mediaPlayer.pause();
34    }
35  
36   public void seekTo(int pos) {
37     mediaPlayer.seekTo(pos);
38   }
39  
40   public void start() {
41     mediaPlayer.start();
42   }
43  
44 });

使用setAnchorView方法去决定MediaController依附在哪个View上,这个View可以是任意View

调用show或者hide来显示或者隐藏。

1 mediaController.setAnchorView(myView);
2 mediaController.show();

管理MediaPlayer的输出

MediaPlayer提供方法去控制音量、锁屏亮度、设置循环模式

控制音量通过setVolume方法。

mediaPlayer.setVolume(0.5f, 0.5f);  值在0-1之间浮点数,0表示静音,1表示最大音量。 2个参数分别代表左声道和右声道

1 mediaPlayer.setScreenOnWhilePlaying(true);  //播放时,屏幕不锁屏。
2  
3 if (!mediaPlayer.isLooping())
4   mediaPlayer.setLooping(true);

有些设备,附上了耳机,或者蓝牙耳机,会提供播放、暂停、skip、上一个播放的 按键

你可以监听Action为:android.intent.action.MEDIA_BUTTON

01 public class MediaControlReceiver extends BroadcastReceiver {
02  
03   public static final String ACTION_MEDIA_BUTTON =
04     “com.paad.ACTION_MEDIA_BUTTON”;
05  
06   @Override
07   public void onReceive(Context context, Intent intent) {
08     if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
09        Intent internalIntent = new Intent(ACTION_MEDIA_BUTTON);
10        internalIntent.putExtras(intent.getExtras());
11        context.sendBroadcast(internalIntent);
12     }
13   }
14 }
15  
16 public class ActivityMediaControlReceiver extends BroadcastReceiver {
17   @Override
18   public void onReceive(Context context, Intent intent) {
19     if (MediaControlReceiver.ACTION_MEDIA_BUTTON.equals(
20          intent.getAction())) {
21        KeyEvent event =
22          (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
23  
24        switch (event.getKeyCode()) {
25          case (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) :
26             if (mediaPlayer.isPlaying())
27               pause();
28             else
29               play();
30             break;
31          case (KeyEvent.KEYCODE_MEDIA_PLAY) :
32             play(); break;
33          case (KeyEvent.KEYCODE_MEDIA_PAUSE) :
34             pause(); break;
35          case (KeyEvent.KEYCODE_MEDIA_NEXT) :
36             skip(); break;
37          case (KeyEvent.KEYCODE_MEDIA_PREVIOUS) :
38  
39             previous(); break;
40           case (KeyEvent.KEYCODE_MEDIA_STOP) :
41             stop(); break;
42           default: break;
43        }
44      }
45   }
46 }

AudioManagerregistMediaButtonEventReceiver方法去注册接受者,可以防止其他APP也在监听ACTION

01 // Register the Media Button Event Receiver to
02 // listen for media button presses.
03 AudioManager am =
04   (AudioManager)getSystemService(Context.AUDIO_SERVICE);
05 ComponentName component =
06   new ComponentName(this, MediaControlReceiver.class);
07  
08 am.registerMediaButtonEventReceiver(component);
09  
10 // Register a local Intent Receiver that receives media button
11 // presses from the Receiver registered in the manifest.
12 activityMediaControlReceiver = new ActivityMediaControlReceiver();
13 IntentFilter filter =
14   new IntentFilter(MediaControlReceiver.ACTION_MEDIA_BUTTON);
15  
16 registerReceiver(activityMediaControlReceiver, filter);

android之多媒体篇(一)的更多相关文章

  1. android之多媒体篇(二)

    管理音频焦点 情景:当你的app隐退到后台,而其他也有播放能力的app浮现在前台,这个时候,你可能要暂停你原有app的播放功能,和解除监听Media Button,把控制权交给前台的APP. 这就需要 ...

  2. android之多媒体篇(三)

    录像 Android提供了2种方案去录像. 方案一: 最简单的方式就是使用Intents去启动App来帮助你完成.这个方案使你能够指定输出的位置和视频的质量.这方案通常是最好的方法,应该可以用在多种情 ...

  3. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

  4. Android官方多媒体API Mediacodec翻译(一)

    因近期工作调整,关于Mediacodec部分的翻译会暂停,后续有时间一定补上,非常抱歉. 本文章为根据Android Mediacodec官方英文版的原创翻译,转载请注明出处:http://www.c ...

  5. android之存储篇——SQLite数据库

    转载:android之存储篇_SQLite数据库_让你彻底学会SQLite的使用 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在In ...

  6. 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)

    说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...

  7. android滑动基础篇 - 触屏显示信息

    效果图: 代码部分: activity类代码: package com.TouchView; /* * android滑动基础篇 * */ import android.app.Activity; i ...

  8. Android的多媒体框架OpenCore介绍

    网上资料很少, 不过还是找到一个比较详细的说明: 特地在此整理了下: 地址:http://blog.csdn.net/djy1992/article/details/9339787 分为几个阶段: 1 ...

  9. Android 逆向实战篇(加密数据包破解)

    1. 实战背景由于工作需要,要爬取某款App的数据,App的具体名称此处不便透露,避免他们发现并修改加密逻辑我就得重新破解了. 爬取这款App时发现,抓包抓到的数据是加密过的,如图1所示(原数据较长, ...

随机推荐

  1. 自学Java过程

    由于之前判断失误,其实也不应该说失误吧,自己脱产花了几个月来啃C,现在基本上算是啃完了吧,之所以说失误是因为:没有找到跟C有关的适合我的工作!!! 本来的打算是先把基础搞定然后去找找看有没有肯收留打杂 ...

  2. 笔记:C语言数据类型在32位与64位机器上的字节数

    读<深入理解计算机系统> 第二章 信息的表示与处理 32位与64位的典型值,单位字节 声明 32位机器 64位机器 char 1 1 short int int 4 4 long int ...

  3. Chapter12&Chapter13:程序实例

    文本查询程序 要求:程序允许用户在一个给定文件中查询单词.查询结果是单词在文件中出现的次数及所在行的列表.如果一个单词在一行中出现多次,此行只列出一次. 对要求的分析: 1.读入文件,必须记住单词出现 ...

  4. 深入理解HBase Memstore

    2013/08/09 转发自http://www.cnblogs.com/shitouer/archive/2013/02/05/configuring-hbase-memstore-what-you ...

  5. HDU ACM 3177 Crixalis's Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. C++builder XE 安装控件 及输出路径

    C++builder XE 安装控件 与cb6不一样了,和delphi可以共用一个包. 启动RAD Studio.打开包文件. Project>Options>Delphi Compile ...

  7. Linux下的crontab定时执行任务命令详解

    在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“cr ...

  8. C++ __int64用法(转)

    在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...

  9. VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN的区别

    最近软矿频繁地介绍了各种VPN,有免费的PacketiX.NET和Hotspot Shield,有付费的Astrill VPN,iVPN和PureVPN.在介绍这些VPN的时候,常常会说到PPTP.L ...

  10. unigui MessageDlg方法调用例子

    procedure TfrmEmployee.btnDeleteClick(Sender: TObject);var aBool: Boolean;begin inherited; MessageDl ...