您的位置:首页 > 其它

Camera基本开发知识

2016-12-03 15:59 190 查看
加权限;如API23及以上,要请求权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />




1:调用系统相机

Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQ_1);


2:调用系统拍照,并把图片存在特定文件夹

private String mFilePath;

mFilePath= Environment.getExternalStorageDirectory().getPath();
mFilePath=mFilePath+"/"+"temp.png";

Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//将拍的图片存在这个路径下
Uri photoUri=Uri.fromFile(new File(mFilePath));
intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);

startActivityForResult(intent, REQ_2);


拍照结束回调:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

FileInputStream fis=null;

if(resultCode==RESULT_OK){
if(requestCode==REQ_1){
Bundle bundle=data.getExtras();
Bitmap bit= (Bitmap) bundle.get("data");
iv.setImageBitmap(bit);
}else if(requestCode==REQ_2){
try {
fis=new FileInputStream(mFilePath);
Bitmap bitmap= BitmapFactory.decodeStream(fis);
iv.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}


3:自定义相机拍照

onResume()中获取相机并绑定surfaceView,开启预览

@Override
protected void onResume() {
super.onResume();
if(mCamera==null){
mCamera=getCamera();

if (mHolder!=null){
setStartPreview(mCamera,mHolder);
}
}
}

/**
* 获取系统camera对象
* @return
*/
private Camera getCamera(){
Camera camera=null;

try {
camera=Camera.open();
}catch (Exception e){
camera=null;
e.printStackTrace();
}

return camera;
}

//实时预览相机图像
private void setStartPreview(Camera camera,SurfaceHolder holder){
try {
camera.setPreviewDisplay(holder);//将相机与surfaceView控件绑定
camera.setDisplayOrientation(90);//将相机试图旋转90度,因为默认是横屏显示
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}

}


当点击拍照的时候:

//点击事件
public void capture(View view){
Camera.Parameters parameters=mCamera.getParameters();//参数
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPictureSize(800, 400);
parameters.setFlashMode(Camera.Parameters.FOCUS_MODE_AUTO);//自动对焦

mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
camera.takePicture(null, null, pictureCallback);
}
}
});

}

//拍照之后回调取数据
private Camera.PictureCallback pictureCallback=new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File file=new File("/sdcard/temp.png");
try {
FileOutputStream fos=new FileOutputStream(file);
fos.write(data);

fos.close();

Intent intent =new Intent(CustomActivity.this,ResultActivity.class);
intent.putExtra("picpath",file.getAbsolutePath());
startActivity(intent);
CustomActivity.this.finish();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};


完整代码如下

public class CustomActivity extends AppCompatActivity implements SurfaceHolder.Callback {

private SurfaceView mSview;
private Camera mCamera;
private SurfaceHolder mHolder;

private Camera.PictureCallback pictureCallback=new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File file=new File("/sdcard/temp.png");
try {
FileOutputStream fos=new FileOutputStream(file);
fos.write(data);

fos.close();

Intent intent =new Intent(CustomActivity.this,ResultActivity.class);
intent.putExtra("picpath",file.getAbsolutePath());
startActivity(intent);
CustomActivity.this.finish();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom);

initView();
mHolder=mSview.getHolder();
mHolder.addCallback(this);
}

private void initView() {
mSview= (SurfaceView) findViewById(R.id.preView);

mSview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(null);//点击自动对焦
}
});

}

@Override
protected void onResume() {
super.onResume();
if(mCamera==null){
mCamera=getCamera();

if (mHolder!=null){
setStartPreview(mCamera,mHolder);
}
}
}

@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
//点击事件
public void capture(View view){
Camera.Parameters parameters=mCamera.getParameters();//参数
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPictureSize(800, 400);
parameters.setFlashMode(Camera.Parameters.FOCUS_MODE_AUTO);//自动对焦

mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
camera.takePicture(null, null, pictureCallback);
}
}
});

}

/**
* 获取系统camera对象
* @return
*/
private Camera getCamera(){
Camera camera=null;

try {
camera=Camera.open();
}catch (Exception e){
camera=null;
e.printStackTrace();
}

return camera;
}
//实时预览相机图像
private void setStartPreview(Camera camera,SurfaceHolder holder){
try {
camera.setPreviewDisplay(holder);//将相机与surfaceView控件绑定
camera.setDisplayOrientation(90);//将相机试图旋转90度,因为默认是横屏显示
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}

}
//释放相机资源
private void releaseCamera(){

if(mCamera!=null){
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera=null;
}
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera, mHolder);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mCamera.stopPreview();
setStartPreview(mCamera, mHolder);

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
}


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30">

<SurfaceView
android:id="@+id/preView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="水印"
android:textColor="#f6424a"
android:textSize="20sp"
android:layout_marginBottom="61dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="capture"
android:onClick="capture"/>

</LinearLayout>


public class ResultActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);

String path=getIntent().getStringExtra("picpath");
// Bitmap bitmap= BitmapFactory.decodeFile(path);
ImageView iv= (ImageView) findViewById(R.id.pic);
//iv.setImageBitmap(bitmap);

try {
FileInputStream fis=new FileInputStream(path);
Bitmap bit = BitmapFactory.decodeStream(fis);

Matrix mat=new Matrix();
mat.setRotate(90);         //把原来当位图旋转90度
bit=Bitmap.createBitmap(bit,0,0,bit.getWidth(),bit.getHeight(),mat,true);

iv.setImageBitmap(bit);

} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: