加权限;如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();
}
}
}