zoukankan      html  css  js  c++  java
  • 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. }





  • 相关阅读:
    (1)java设计模式之简单工厂模式
    QuartZ Cron表达式在java定时框架中的应用
    java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
    https实现安全传输的流程
    liunx上运行mybase
    liux之sed用法
    java并发之CyclicBarrier
    java并发之Semaphore
    关于ConcurrentSkipListMap的理解
    java中Iterator和ListIterator的区别与联系
  • 原文地址:https://www.cnblogs.com/phonecom/p/831ac3664fb09b8f4eea1f1d4f2e96f4.html
Copyright © 2011-2022 走看看