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. 机器学习中的算法-决策树模型组合之随机森林与GBDT

    机器学习中的算法(1)-决策树模型组合之随机森林与GBDT 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使 ...

  2. memset()实现及细节

    memset是计算机中C/C++语言函数.将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为 ...

  3. Java正则表达式获取网页所有网址和链接文字

    ;         pos1= urlContent.indexOf(strAreaBegin)+strAreaBegin.length();         pos2=urlContent.inde ...

  4. 深入理解HBase Memstore

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

  5. Lync激活用户遇到ConstraintViolationNoLeadingOrTrailingWhitespace错误

    启用用户的时候出现错误ConstraintViolationNoLeadingOrTrailingWhitespace,如下图 解决方案:域控中,该用户的名字最后多出了个空格,批量生成域用户的脚本问题 ...

  6. Hadoop HDFS概念学习系列之分布式文件管理系统(二十五)

    数据量越来越多,在一个操作系统管辖的范围存在不了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来 管理多台机器上的文件,这就是分布式文件管理系统. 是一种允许文件 ...

  7. binarySearch二分查找——Javascript实现

    在很早之前,我就写过了一篇也关于二分法的相关博文:JavaScript快排与原生sort的测试.当时是用二分法进行快速排序,其实和这次思路大致相当.二分查找最重要的一个条件,就是需要将数组先按照从小到 ...

  8. 摄影初学者挑选相机的常见问题 FAQ

    数码相机一次次降价,越来越多的人加入摄影的行列,照相器材还是一个比较专业的领域,并非简单的参数比一下高低就可以知道好坏,很多朋友往往了解了好久还没弄清孰优孰劣,在购机前踌躇半天拿不定主意,我收集了被问 ...

  9. Python基础-函数(function)

    这里我们看看Python中函数定义的语法,函数的局部变量,函数的参数,Python中函数的形参可以有默认值,参数的传递是赋值操作,在函数调用时,可以对实参进行打包和解包  1,函数定义 关键字def引 ...

  10. LA4329 Ping pong(树状数组与组合原理)

    N (3N20000)ping pong players live along a west-east street(consider the street as a line segment). E ...