day10 多媒体(文字 图片 音频 视频)

1计算机表示图形的几种方式
    bmp:以高质量保存     用于计算机
    jpg:以良好的质量保存    用于计算机或者网络
    png:以高质量保存
    图片大小的计算公式:图片的总像素*每个像素的大小    (多出的一点是图片的信息)
    单色:每个像素最多可以表示2种颜色 要么是黑要么是白 那么只需要使用长度为1的二进制位来表示    那么一个像素占1/8byte
    16色:每个像素最多可以表示16种颜色 0000-1111 那么只需要使用长度为4的二进制位来表示    那么一个像素占1/2byte
    256色:每个像素最多可以表示256种颜色 0000 0000-1111 1111 那么只需要使用长度为8的二进制位来表示    那么一个像素占1byte
    24每个像素最多可以表示1600万多种颜色 0000 0000 0000 0000 0000 0000-1111 1111 1111 1111 1111 1111 那么一个像素占3byte   rgb:r----1byte   g----1byte   b----1byte

Android中采用的是png格式    Android中采用ARGB    Android中一个像素占4byte


2缩放加载大图片
[1]获取图片的分辨率
[2]获取手机的分辨率
[3]计算缩放比    用图片的分辨率宽高除以手机分辨率,最后在宽高中选大的
[4]按照大的去缩放

实现步骤:
[1]获取手机分辨率
  1. // [1]获取手机的分辨率windowmanager
  2. WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
  3. // 获取高
  4. int height = wm.getDefaultDisplay().getHeight();
  5. int width = wm.getDefaultDisplay().getWidth();
  6. System.out.println("" + width + " height:" + height);
[2]获取图片的分辨率
  1. //创建一个位图工厂的配置参数
  2. BitmapFactory.Options options = new Options();
  3. //解码器不去真正的解析位图 但是还能够获取图片的宽和高信息
  4. options.inJustDecodeBounds = true;
  5. BitmapFactory.decodeFile("/mnt/sdcard/lings.jpg", options);
  6. //[2]获取图片的宽和高信息
  7. int imgWidth = options.outWidth;
  8. int imgHeight = options.outHeight;
[3]计算缩放比
  1. //[3]计算缩放比
  2. int scale = 1;
  3. int scaleX = imgWidth/width;
  4. int scaleY = imgHeight/height;
  5. if(scaleX>=scaleY && scaleX > 1){
  6. scale = scaleX;
  7. }
  8. if(scaleX<scaleY && scaleY > 1){
  9. scale = scaleY;
  10. }
[4]按照缩放比进行显示
  1. //[4]按照缩放比进行显示
  2. options.inSampleSize = scale;
  3. //[5]按照缩放比 进行解析位图
  4. options.inJustDecodeBounds = false;
  5. Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/lings.jpg", options);
  6. //[6]把bitmap显示iv上
  7. iv.setImageBitmap(bitmap);

注意:[1]真实手机是改不了 dvm分配的内存大小
          [2]缩放加载大图片    就是加载分辨率特别大的图片

3创建原图的副本
  1. package com.phone.fuben;
  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Matrix;
  7. import android.graphics.Paint;
  8. import android.os.Bundle;
  9. import android.support.v7.app.ActionBarActivity;
  10. import android.widget.ImageView;
  11. public class MainActivity extends ActionBarActivity {
  12. private ImageView iv_src;
  13. private ImageView iv_copy;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. // 显示原图
  19. iv_src = (ImageView) findViewById(R.id.iv_src);
  20. // 显示副本
  21. iv_copy = (ImageView) findViewById(R.id.iv_copy);
  22. // [1]先把lings.jpg图片转换成bitmap显示到iv_src
  23. Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(),
  24. R.drawable.lings);
  25. // 操作图片
  26. // srcBitmap.setPixel(20, 30, Color.RED);
  27. iv_src.setImageBitmap(srcBitmap);
  28. // [2]创建原图的副本(模板代码)
  29. // 创建一个模板 相当于创建了一个大小和原图一样的空白的白纸
  30. Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),
  31. srcBitmap.getHeight(), srcBitmap.getConfig());
  32. // 想作画需要一个画笔
  33. Paint paint = new Paint();
  34. // 创建一个画布 把白纸铺到画布上
  35. Canvas canvas = new Canvas(copyBitmap);
  36. // 开始作画
  37. canvas.drawBitmap(srcBitmap, new Matrix(), paint);
  38. // 操作画出来的小猫图片
  39. for (int i = 0; i < 20; i++) {
  40. copyBitmap.setPixel(20 + i, 30, Color.RED);
  41. }
  42. // [3]把copybitmap显示到iv_copy上
  43. iv_copy.setImageBitmap(copyBitmap);
  44. }
  45. }


4图形处理的api
旋转
缩放
平移
镜面
倒影
  1. package com.phone.fuben1;
  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Matrix;
  7. import android.graphics.Paint;
  8. import android.os.Bundle;
  9. import android.support.v7.app.ActionBarActivity;
  10. import android.widget.ImageView;
  11. import com.phone.fuben1.R;
  12. public class MainActivity extends ActionBarActivity {
  13. private ImageView iv_src;
  14. private ImageView iv_copy;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. // 显示原图
  20. iv_src = (ImageView) findViewById(R.id.iv_src);
  21. // 显示副本
  22. iv_copy = (ImageView) findViewById(R.id.iv_copy);
  23. // [1]先把lings.jpg图片转换成bitmap显示到iv_src
  24. Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(),
  25. R.drawable.lings);
  26. // 操作图片
  27. // srcBitmap.setPixel(20, 30, Color.RED);
  28. iv_src.setImageBitmap(srcBitmap);
  29. // [2]创建原图的副本(模板代码)
  30. // 创建一个模板 相当于创建了一个大小和原图一样的空白的白纸
  31. Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),
  32. srcBitmap.getHeight(), srcBitmap.getConfig());
  33. // 想作画需要一个画笔
  34. Paint paint = new Paint();
  35. // 创建一个画布 把白纸铺到画布上
  36. Canvas canvas = new Canvas(copyBitmap);
  37. // 开始作画
  38. Matrix matrix = new Matrix();
  39. // 对图片进行旋转
  40. matrix.setRotate(20, srcBitmap.getWidth() / 2,
  41. srcBitmap.getHeight() / 2);
  42. // 对图片进行缩放
  43. matrix.setScale(0.5f, 0.5f);
  44. // 对图片进行平移
  45. matrix.setTranslate(20, 0);
  46. //对图片进行镜面效果
  47. //如果两个方法一起用就要用post前缀,post是在上一次修改的基础上进行再次修改 set每次操作都是最新的 会覆盖上次的操作
  48. matrix.setScale(-1.0f, 1);
  49. matrix.postTranslate(srcBitmap.getWidth(), 0);
  50. //对图片进行倒影效果
  51. matrix.setScale(1, -1.0f);
  52. matrix.postTranslate(0, srcBitmap.getHeight());
  53. canvas.drawBitmap(srcBitmap, matrix, paint);
  54. // [3]把copybitmap显示到iv_copy上
  55. iv_copy.setImageBitmap(copyBitmap);
  56. }
  57. }



5画画板小案例
  1. package com.phone.painting;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.graphics.Bitmap;
  7. import android.graphics.Bitmap.CompressFormat;
  8. import android.graphics.BitmapFactory;
  9. import android.graphics.Canvas;
  10. import android.graphics.Color;
  11. import android.graphics.Matrix;
  12. import android.graphics.Paint;
  13. import android.net.Uri;
  14. import android.os.Bundle;
  15. import android.os.Environment;
  16. import android.os.SystemClock;
  17. import android.view.MotionEvent;
  18. import android.view.View;
  19. import android.view.View.OnTouchListener;
  20. import android.widget.ImageView;
  21. public class MainActivity extends Activity {
  22. private Bitmap srcBitmap;
  23. private ImageView iv;
  24. private Bitmap copyBitmap;
  25. private Canvas canvas;
  26. private Paint paint;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_main);
  31. // 用来显示我们画的内容
  32. iv = (ImageView) findViewById(R.id.iv);
  33. // [1]获取原图bg
  34. srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
  35. // [2]获取原图的副本 相当于一个空白的白纸
  36. copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),
  37. srcBitmap.getHeight(), srcBitmap.getConfig());
  38. paint = new Paint();
  39. canvas = new Canvas(copyBitmap);
  40. // 开始作画
  41. canvas.drawBitmap(srcBitmap, new Matrix(), paint);
  42. canvas.drawLine(20, 30, 50, 80, paint);
  43. iv.setImageBitmap(copyBitmap);
  44. // [3]给iv设置一个触摸控件
  45. iv.setOnTouchListener(new OnTouchListener() {
  46. private int startX;
  47. private int startY;
  48. @Override
  49. public boolean onTouch(View v, MotionEvent event) {
  50. // 获取当前事件类型
  51. int action = event.getAction();
  52. switch (action) {
  53. case MotionEvent.ACTION_DOWN:// 按下
  54. System.out.println("摸view");
  55. startX = (int) event.getX();
  56. startY = (int) event.getY();
  57. break;
  58. case MotionEvent.ACTION_MOVE:// 移动
  59. System.out.println("移动");
  60. // 获取结束位置
  61. int stopX = (int) event.getX();
  62. int stopY = (int) event.getY();
  63. // 不停的划线
  64. canvas.drawLine(startX, startY, stopX, stopY, paint);
  65. // 再次显示到控件上
  66. iv.setImageBitmap(copyBitmap);
  67. startX = stopX;
  68. startY = stopY;
  69. break;
  70. case MotionEvent.ACTION_UP:// 抬起
  71. System.out.println("抬起");
  72. break;
  73. }
  74. // true 监听器处理完事件了
  75. return true;
  76. }
  77. });
  78. }
  79. //点击按钮改变画笔 的颜色
  80. public void click1(View v) {
  81. paint.setColor(Color.RED);
  82. }
  83. //点击按钮加粗画笔
  84. public void click2(View v) {
  85. paint.setStrokeWidth(15);
  86. }
  87. //点击按钮保存图片
  88. public void click3(View v) {
  89. try {
  90. /**
  91. * format 保存图片的格式
  92. * quality 保存图片的质量
  93. * stream
  94. */
  95. //SystemClock.uptimeMillis() 当前手机开机时间
  96. File file = new File(Environment.getExternalStorageDirectory().getPath(),SystemClock.uptimeMillis()+".png");
  97. FileOutputStream fos;
  98. fos = new FileOutputStream(file);
  99. copyBitmap.compress(CompressFormat.PNG, 100, fos);
  100. //发送一条广播 欺骗系统图库的应用
  101. Intent intent = new Intent();
  102. //设置action
  103. intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
  104. intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
  105. //发送一下广播
  106. sendBroadcast(intent);
  107. } catch (Exception e) {
  108. e.printStackTrace();
  109. }
  110. }
  111. }
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


6撕衣服小案例
    原理:2张图片
  1. package com.phone.syf;
  2. import android.R.integer;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Matrix;
  8. import android.graphics.Paint;
  9. import android.os.Bundle;
  10. import android.support.v7.app.ActionBarActivity;
  11. import android.view.MotionEvent;
  12. import android.view.View;
  13. import android.view.View.OnTouchListener;
  14. import android.widget.ImageView;
  15. public class MainActivity extends ActionBarActivity {
  16. private Bitmap alterBitmap;
  17. private ImageView iv;
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. iv = (ImageView) findViewById(R.id.iv);
  23. // [1]获取要操作图片的原图
  24. Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(),
  25. R.drawable.lings1);
  26. alterBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),
  27. srcBitmap.getHeight(), srcBitmap.getConfig());
  28. // 创建画笔
  29. Paint paint = new Paint();
  30. // 创建画布
  31. Canvas canvas = new Canvas(alterBitmap);
  32. // 开始作画
  33. canvas.drawBitmap(srcBitmap, new Matrix(), paint);
  34. iv.setImageBitmap(alterBitmap);
  35. // [3]给iv设置一个触摸事件
  36. iv.setOnTouchListener(new OnTouchListener() {
  37. @Override
  38. public boolean onTouch(View v, MotionEvent event) {
  39. // [4]具体判断一下触摸事件
  40. switch (event.getAction()) {
  41. case MotionEvent.ACTION_MOVE:// 移动事件
  42. for (int x = -7; x < 7; x++) {
  43. for (int y = -7; y < 7; y++) {
  44. if (Math.sqrt(x * x + y * y) < 7) {
  45. try {
  46. alterBitmap.setPixel(
  47. (int) event.getX() + x,
  48. (int) event.getY() + y,
  49. Color.TRANSPARENT);
  50. } catch (Exception e) {
  51. }
  52. }
  53. }
  54. }
  55. // 更新一下iv
  56. iv.setImageBitmap(alterBitmap);
  57. break;
  58. }
  59. return true;
  60. }
  61. });
  62. }
  63. }

7使用mediaplayer播放音频文件
    [1]这个类用于播放音频或者视频
  1. package com.phone.videoplayer;
  2. import android.app.Activity;
  3. import android.media.MediaPlayer;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. public class MainActivity extends Activity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. }
  12. //点击按钮 播放一个音频文件
  13. public void click(View v){
  14. //[1]初始化mediaplayer
  15. MediaPlayer mediaPlayer = new MediaPlayer();
  16. //[2]设置要播放的资源位置 path 可以是网络 路径 也可是本地路径
  17. try {
  18. mediaPlayer.setDataSource("/mnt/sdcard/me.mp3");
  19. //[3]准备播放
  20. mediaPlayer.prepare();
  21. //[4]开始播放
  22. mediaPlayer.start();
  23. } catch (Exception e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. }
  28. }
 
8百度音乐盒完善
  1. package com.phone.baidumusic;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.media.MediaPlayer;
  7. import android.media.MediaPlayer.OnCompletionListener;
  8. import android.os.Binder;
  9. import android.os.Bundle;
  10. import android.os.IBinder;
  11. import android.os.Message;
  12. public class MusicService extends Service {
  13. private MediaPlayer mediaPlayer;
  14. @Override
  15. public IBinder onBind(Intent intent) {
  16. return new MyBinder();
  17. }
  18. @Override
  19. public void onCreate() {
  20. // [1]初始化mediaplayer
  21. mediaPlayer = new MediaPlayer();
  22. super.onCreate();
  23. }
  24. @Override
  25. public void onDestroy() {
  26. super.onDestroy();
  27. }
  28. //实现指定播放的位置
  29. public void seekTo(int position){
  30. mediaPlayer.seekTo(position);
  31. }
  32. // 播放音乐
  33. public void playMusic() {
  34. // [2]设置要播放的资源位置 path 可以是网络 路径 也可以是本地路径
  35. try {
  36. mediaPlayer.reset();
  37. mediaPlayer.setDataSource("/mnt/sdcard/me.mp3");
  38. // [3]准备播放
  39. mediaPlayer.prepare();
  40. // [4]开始播放
  41. mediaPlayer.start();
  42. // [5]更新进度条
  43. UpdateSeekBar();
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. System.out.println("音乐播放了");
  48. }
  49. // 更新进度条的方法
  50. private void UpdateSeekBar() {
  51. //[1]获取到当前播放的总长度
  52. final int duration = mediaPlayer.getDuration();
  53. //[2]使用Timer定时器去定时获取当前进度
  54. final Timer timer = new Timer();
  55. final TimerTask task = new TimerTask() {
  56. @Override
  57. public void run() {
  58. //[1]一秒钟获取一次当前进度
  59. int currentPosition = mediaPlayer.getCurrentPosition();
  60. //[4]拿着我们在mainactivity创建的handler 发消息 消息就可以携带数据
  61. Message msg =Message.obtain();
  62. Bundle data = new Bundle();
  63. data.putInt("duration", duration);
  64. data.putInt("currentPosition", currentPosition);
  65. msg.setData(data);
  66. //发送一条消息 mainactivity里面的handlermessage方法就会执行
  67. MainActivity.handler.sendMessage(msg);
  68. }
  69. };
  70. //100毫秒后每隔1秒执行一次run方法
  71. timer.schedule(task, 100, 1000);
  72. //当歌曲执行完毕后 把timer和timertask取消
  73. mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
  74. @Override
  75. public void onCompletion(MediaPlayer mp) {
  76. System.out.println("歌曲播放完成了");
  77. //把timer和timertask取消
  78. timer.cancel();
  79. task.cancel();
  80. }
  81. });
  82. }
  83. // 暂停音乐
  84. public void pauseMusic() {
  85. mediaPlayer.pause();
  86. System.out.println("音乐暂停了");
  87. }
  88. // 继续播放音乐
  89. public void rePlayMusic() {
  90. mediaPlayer.start();
  91. System.out.println("音乐继续播放了");
  92. }
  93. // [1]在服务的内部定义一个中间对象(IBinder)
  94. private class MyBinder extends Binder implements IService {
  95. @Override
  96. public void callPlayMusic() {
  97. playMusic();
  98. }
  99. @Override
  100. public void callPauseMusic() {
  101. pauseMusic();
  102. }
  103. @Override
  104. public void callRePlayMusic() {
  105. rePlayMusic();
  106. }
  107. @Override
  108. public void callSeekTo(int position) {
  109. seekTo(position);
  110. }
  111. }
  112. }
  1. package com.phone.baidumusic;
  2. import android.app.Activity;
  3. import android.content.ComponentName;
  4. import android.content.Intent;
  5. import android.content.ServiceConnection;
  6. import android.os.Bundle;
  7. import android.os.Handler;
  8. import android.os.IBinder;
  9. import android.view.View;
  10. import android.widget.SeekBar;
  11. import android.widget.SeekBar.OnSeekBarChangeListener;
  12. public class MainActivity extends Activity {
  13. //中间人对象
  14. private IService iService;
  15. private MyConn conn;
  16. private static SeekBar sbar;
  17. public static Handler handler = new Handler(){
  18. public void handleMessage(android.os.Message msg) {
  19. //获取我们携带的数据
  20. Bundle data = msg.getData();
  21. int duration = data.getInt("duration");
  22. int currentPosition = data.getInt("currentPosition");
  23. //设置seekbar的进度
  24. sbar.setMax(duration);
  25. sbar.setProgress(currentPosition);
  26. };
  27. };
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.activity_main);
  32. //混合方式开启服务
  33. //[1]先调用startservice 目的是可以保证服务在后台长期运行
  34. Intent intent = new Intent(this, MusicService.class);
  35. startService(intent);
  36. //[2]调用bindservice 目的为了获取我们定义的中间人对象 就可以间接的调用服务里面的方法了
  37. conn = new MyConn();
  38. bindService(intent, conn, BIND_AUTO_CREATE);
  39. //[3]找到seekbar 设置进度
  40. sbar = (SeekBar) findViewById(R.id.seekBar1);
  41. //[4]给seekbar设置监听事件
  42. sbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
  43. //当拖动停止的时候调用
  44. @Override
  45. public void onStopTrackingTouch(SeekBar seekBar) {
  46. iService.callSeekTo(seekBar.getProgress());
  47. }
  48. //当开始拖动
  49. @Override
  50. public void onStartTrackingTouch(SeekBar seekBar) {
  51. }
  52. //当进度改变
  53. @Override
  54. public void onProgressChanged(SeekBar seekBar, int progress,
  55. boolean fromUser) {
  56. }
  57. });
  58. }
  59. @Override
  60. protected void onDestroy() {
  61. //当Activity销毁的时候 解绑服务
  62. unbindService(conn);
  63. super.onDestroy();
  64. }
  65. //点击按钮 播放音乐
  66. public void click1(View v){
  67. iService.callPlayMusic();
  68. }
  69. //点击按钮 暂停音乐
  70. public void click2(View v){
  71. iService.callPauseMusic();
  72. }
  73. //点击按钮 继续播放音乐
  74. public void click3(View v){
  75. iService.callRePlayMusic();
  76. }
  77. //监听服务的状态
  78. private class MyConn implements ServiceConnection{
  79. @Override
  80. public void onServiceConnected(ComponentName name, IBinder service) {
  81. iService = (IService) service;
  82. }
  83. @Override
  84. public void onServiceDisconnected(ComponentName name) {
  85. }
  86. }
  87. }
  1. package com.phone.baidumusic;
  2. public interface IService {
  3. public void callPlayMusic();
  4. public void callPauseMusic();
  5. public void callRePlayMusic();
  6. public void callSeekTo(int position);
  7. }

9mediaplayer的生命周期
    同步和异步
    同步:一般播放本地音乐    
    异步:播放网络音乐    不用开子线程
  1. package com.phone.videoplayer;
  2. import android.app.Activity;
  3. import android.media.MediaPlayer;
  4. import android.media.MediaPlayer.OnPreparedListener;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import com.phone.videoplayeronline.R;
  8. public class MainActivity extends Activity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. }
  14. //点击按钮 播放一个音频文件
  15. public void click(View v){
  16. //[1]初始化mediaplayer
  17. final MediaPlayer mediaPlayer = new MediaPlayer();
  18. //[2]设置要播放的资源位置 path 可以是网络 路径 也可是本地路径
  19. try {
  20. mediaPlayer.setDataSource("http://192.168.11.86:8080/xpg.mp3");
  21. //[3]准备播放
  22. mediaPlayer.prepareAsync();
  23. //设置一个准备完成的监听
  24. mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
  25. @Override
  26. public void onPrepared(MediaPlayer mp) {
  27. //开始播放
  28. mediaPlayer.start();
  29. }
  30. });
  31. } catch (Exception e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35. }
  36. }
  1. <uses-permission android:name="android.permission.INTERNET"/>

10surfaceview介绍
    播放视频
    mediaplayer    只能播放MP4格式或3gp格式
    surfaceview     是一个重量级控件
                          内部维护了2个线程
                            A    加载数据    A负责显示
                            B    复制显示    b负责去加载数据
                        可以直接在子线程更新UI

11 VideoView控件介绍
    VideoView 是对surfaceView 和 mediaplayer的封装
    avi格式    或者rmvb格式

12 vitamio开源框架(有官网)
  使用步骤:
        [1]引入vitamio框架  引library
        [2]在布局中定义VideoView
            <io.vov.vitamio.widget.VideoView
        android:id="@+id/vv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
        [3]mainactivity代码
  1. //使用vitamio
  2. //插件vitamio框架检查是否可用
  3. if(!LibsChecker.checkVitamioLibs(this)){
  4. return;
  5. }
  6. final VideoView vv = (VideoView)findViewById(R.id.vv);
  7. vv.setVideoPath("http://192.168.11.86:8080/aa.avi");
  8. vv.setOnPreparedListener(new OnPreparedListener() {
  9. @Override
  10. public void onPrepared(MediaPlayer mp) {
  11. vv.start();
  12. }
  13. });
  14. //设置video的控制器
  15. vv.setMediaController(new MediaController(this));

        [4]一定要在清单文件初始化InitActivity
  1. <!-- 一定要在清单文件初始化InitActivity -->
  2. <activity android:name="io.vov.vitamio.activity.InitActivity"></activity>

    解码原理:使用的是一个开源项目    ffmpeg    

13    照相机和录像机
  1. package com.phone.camera;
  2. import java.io.File;
  3. import android.content.Intent;
  4. import android.net.Uri;
  5. import android.os.Bundle;
  6. import android.os.Environment;
  7. import android.provider.MediaStore;
  8. import android.support.v7.app.ActionBarActivity;
  9. import android.view.View;
  10. public class MainActivity extends ActionBarActivity {
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. }
  16. //点击按钮进行照相
  17. public void click1(View v) {
  18. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  19. File file = new File(Environment.getExternalStorageDirectory().getPath(),"ahha.png");
  20. //保存图片的位置
  21. intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
  22. startActivityForResult(intent, 1);
  23. //发送一条广播 欺骗系统图库的应用
  24. Intent intent1 = new Intent();
  25. //设置action
  26. intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
  27. intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
  28. //发送一下广播
  29. sendBroadcast(intent1);
  30. }
  31. //当开启的activity关闭的时候调用
  32. @Override
  33. protected void onActivityResult(int arg0, int arg1, Intent arg2) {
  34. System.out.println("方法执行了");
  35. super.onActivityResult(arg0, arg1, arg2);
  36. }

  37. //点击按钮进行录像
  38. public void click2(View v) {
  39. Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
  40. File file = new File(Environment.getExternalStorageDirectory().getPath(),"ahhaA.MP4");
  41. //保存图片的位置
  42. intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
  43. startActivityForResult(intent, 2);
  44. //发送一条广播 欺骗系统图库的应用
  45. Intent intent1 = new Intent();
  46. //设置action
  47. intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
  48. intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
  49. //发送一下广播
  50. sendBroadcast(intent1);
  51. }
  52. }





原文地址:https://www.cnblogs.com/phonecom/p/831ac3664fb09b8f4eea1f1d4f2e96f4.html