Android46_摄像头

摄像头

一、 使用Intent拍摄照片:
(一)、 使用步骤:
  • 1、启动系统原生的Camera程序来拍摄照片: intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    • 最简单的方法是使用:MediaStore.ACTION_IMAGE_CAPTURE动作触发一个Intent。这将启动一个Camera应用程序来拍摄照片,不需要重写原生Camera应用程序,就可以为用户提供全套的摄像头功能。
    • 默认情况下,拍摄的照片将作为一个缩略图返回,通过返回的Intent的extra(该extra的键名为data)可以访问原始位图。
  • 2、指定一个用于存储拍摄照片的目标文件,图片路径被编码在Uri对象中 : intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    • 要获得完整图像,必须指定一个用于存储该图像的目标文件,该File对象将被编码为Uri对象,并在启动Intent后,在putExtra()方法中作为参数传入。这样摄像头拍摄的完整图像就被保存在了指定位置。
  • 3、照片通过onActivityResult()处理程序将收到的Intent返回给应用程序: 
    • 可以将接收到的照片先进行裁剪,然后再次保存进Uri中所指定的文件路径;
      • intent.setAction("com.android.camera.action.CROP");
      • intent.setDataAndType(imageUri, "image/*"); 
      • intent.putExtra("scale", true);
      • intent.putExtra("output", imageUri);
    • 然后再将裁切好的图片显示在Activity指定ImageView中。
      • Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath()); 
      • imageView_main_show.setImageBitmap(bm);

(二)、核心代码:

1、核心代码:
 
   

public class MainActivity extends Activity {

private ImageView imageView_main_show;

private Uri imageUri = null;

private File file = null;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView_main_show = (ImageView) findViewById(R.id.imageView_main_show);

}


public void clickButton(View view) {

file = new File(Environment.getExternalStorageDirectory()

.getAbsolutePath() + "/mypic.jpg");

try {

if (file.exists()) {

file.delete();

}

} catch (Exception e) {

e.printStackTrace();

}

imageUri = Uri.fromFile(file);

switch (view.getId()) {

case R.id.button_main_takephoto:

Intent intent = new Intent();

// 启动系统原生的Camera程序来拍摄照片。

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

// 指定一个用于存储该图像的目标文件,图片路径被编码在Uri对象中

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);


// 或者:以下的写法:

// intent.setAction("android.media.action.IMAGE_CAPTURE");

// intent.putExtra("output", imageUri);

startActivityForResult(intent, 1);

break;


case R.id.button_main_choose:

Intent intent2 = new Intent(Intent.ACTION_GET_CONTENT);

// Intent intent2 = new Intent("android.intent.action.GET_CONTENT");

intent2.setType("image/*");

intent2.putExtra("crop", true);

intent2.putExtra("scale", true);

intent2.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent2, 2);

break;

}

}


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == 1 && resultCode == RESULT_OK) {

Intent intent = new Intent();

intent.setAction("com.android.camera.action.CROP");

intent.setDataAndType(imageUri, "image/*");

intent.putExtra("scale", true);

intent.putExtra("output", imageUri);

startActivityForResult(intent, 2);

}

if (requestCode == 2 && resultCode == RESULT_OK) {

Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());

imageView_main_show.setImageBitmap(bm);

}

}


}



二、直接控制摄像头:【五部曲】
(一)、使用步骤:
1、为了直接访问摄像头硬件,需要权限:
    <uses-permission android:name="android. permission.CAMERA"/>

2、打开摄像头: Camera.open();
        必要时可以设置摄像头和图像的参数;

3、使用摄像头预览:( 摄像头预览是使用SurfaceHolder实现的,必须在UI中包含一个SurfaceView。)
  • 初始化SurfaceView:
    • surfaceView_main = (SurfaceView) findViewById(R.id.surfaceView_main);
    • surfaceHolder = surfaceView_main.getHolder();
    • surfaceHolder.addCallback();
  • 在surfaceCreated()中开启预览:
    • mCamera.setPreviewDisplay(surfaceHolder);
    • mCamera.startPreview();
  • 在surfaceDestroyed()中停止预览:
    • mCamera.stopPreview();

4、拍摄照片:
  • 调用Camera对象的takePicture()方法实现拍照:
    • mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
  • 获取拍照的三个回调对象参数:
    • ShutterCallback(shutterCallback 当快门关闭时执行的操作);
    • PictureCallback(rawCallback 对图像原始数据做处理);
    • PictureCallback(jpegCallback 对图像的JPEG数据进行操作)。

5、释放摄像头:
  • 在onPause()生命周期中释放摄像头:
    • mCamera.release();
  • 在onResume()生命周期再打开摄像头:
    • Camera.open();

(二)、核心代码:       

1、核心代码:
 
   

 public class MainActivity extends Activity {

private Camera mCamera = null;

private SurfaceView surfaceView_main;

private SurfaceHolder surfaceHolder;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


}


private void initSurfaceView() {

surfaceView_main = (SurfaceView) findViewById(R.id.surfaceView_main);

surfaceHolder = surfaceView_main.getHolder();

// surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceHolder.addCallback(new SurfaceHolder.Callback() {


@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if (mCamera != null) {

mCamera.stopPreview();

}

}


@Override

public void surfaceCreated(SurfaceHolder holder) {

try {

mCamera.setPreviewDisplay(surfaceHolder);

mCamera.startPreview();

} catch (Exception e) {

e.printStackTrace();

}

}


@Override

public void surfaceChanged(SurfaceHolder holder, int format,

int width, int height) {

// TODO Auto-generated method stub


}

});

}


@Override

protected void onResume() {

super.onResume();

if (mCamera == null) {

mCamera = Camera.open();

}

}


@Override

protected void onPause() {

super.onPause();

if (mCamera != null) {

mCamera.release();

}

}


public void clickButton(View view) {

switch (view.getId()) {

case R.id.button_main_preview:

initSurfaceView();

break;


case R.id.button_main_takepicture:

mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);

break;

}

}


ShutterCallback shutterCallback = new ShutterCallback() {


@Override

public void onShutter() {

// TODO Auto-generated method stub


}

};


PictureCallback rawCallback = new PictureCallback() {


@Override

public void onPictureTaken(byte[] data, Camera camera) {

// TODO Auto-generated method stub


}

};


PictureCallback jpegCallback = new PictureCallback() {


@Override

public void onPictureTaken(byte[] data, Camera camera) {

setTitle(data.length + "");

}

};


@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}




三、播放器:
(一)、使用Intent录制视频:

1、核心代码:
 
   

 





(二)、MediaPlayer播放视频:

1、核心代码:
 
   

 




(三)、SoundPool声音池:

1、核心代码:
 
   

 



良心的公众号,更多精品文章,不要忘记关注哈

《Android和Java技术栈》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值