大家好,又见面了,我是你们的朋友全栈君。
Android有两种拍照方法,一种是直接调用系统的照相Intent,使用 onActivityResult获取图片资源或者指定图片路径,拍照返回成功后去指定路径读取图片;一种是用SurfaceView自定义界面,添加业务个性化功能。
一、第一种方法
1、设计界面
(1)、布局文件
打开activity_main.xml文件。
输入以下代码:
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/bysystem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用系统相机不返回结果" />
<Button
android:id="@+id/byself"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用系统相机并返回结果" />
<ImageView
android:id="@+id/photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
2、程序文件
打开“src/com.genwoxue.camera/MainActivity.java”文件。
然后输入以下代码:
package com.genwoxue.camera;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnSystem=null;
private Button btnSelf=null;
private File file=null;
private static final String FILENAME="photo.jpg";
private static String path="";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSystem=(Button)super.findViewById(R.id.bysystem);
btnSelf=(Button)super.findViewById(R.id.byself);
//调用系统照相机,不返回结果
btnSystem.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
Intent intent = new Intent();
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
startActivity(intent);
}
});
//调用系统照相机,返回结果
btnSelf.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
//判断外部存储卡是否存在
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(getApplicationContext(), "读取失败,SD存储卡不存在!", Toast.LENGTH_LONG).show();
return;
}
//判断文件是否存在
path=Environment.getExternalStorageDirectory().toString()+File.separator+"genwoxue"+File.separator+FILENAME;
file=new File(path);
if(!file.exists()){
File vDirPath = file.getParentFile();
vDirPath.mkdirs();
Toast.makeText(getApplicationContext(), "photo.jpg文件不存在!", Toast.LENGTH_LONG).show();
return;
}
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, 1);
}
});
}
}
3、运行结果
二、第二种方法。
1、设计界面
(1)、布局文件
打开activity_main.xml文件。
输入以下代码:
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/byself"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照(自定义相机)" />
<SurfaceView
android:id="@+id/photo"
android:layout_width="300dip"
android:layout_height="400dip" />
</LinearLayout>
2、程序文件
打开“src/com.genwoxue.cameradiy/MainActivity.java”文件。
然后输入以下代码:
package com.genwoxue.cameradiy;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnSelf=null;
private Camera camera=null;
private static final String TAG="PhotoDIY";
private String path="";
private boolean previewRuning=true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化SurfaceView
SurfaceView mpreview = (SurfaceView) this.findViewById(R.id.photo);
SurfaceHolder mSurfaceHolder = mpreview.getHolder();
mSurfaceHolder.addCallback(new SurfaceViewCallback());
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btnSelf=(Button)super.findViewById(R.id.byself);
//拍照(自定义相机)
btnSelf.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
if(camera!=null){
camera.autoFocus(new AutoFocusCallbackimpl());
}
}
});
}
public class SurfaceViewCallback implements SurfaceHolder.Callback{
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int heith){
}
@Override
public void surfaceCreated(SurfaceHolder holder){
//现在智能机可能会有多个镜头:一般前置为1;后置为0
MainActivity.this.camera=Camera.open(0);
//设置参数
Parameters param=camera.getParameters();
param.setPictureFormat(PixelFormat.JPEG);
param.set("jpeg-quality",85);
param.setPreviewFrameRate(5);
camera.setParameters(param);
try {
camera.setPreviewDisplay(holder); //成像在SurfaceView
} catch (IOException e) {
e.printStackTrace();
}
//开始预览
camera.startPreview();
previewRuning=true;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
if(camera!=null){
if(previewRuning){
camera.stopPreview();
previewRuning=false;
}
camera.release();
}
}
}
//调用takePicture()方法时,自动执行pictureCallback回调方法
public PictureCallback picture=new PictureCallback(){
@Override
public void onPictureTaken(byte[] data,Camera camera){
Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
//判断外部存储卡是否存在
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(getApplicationContext(), "读取失败,SD存储卡不存在!", Toast.LENGTH_LONG).show();
return;
}
//判断文件是否存在
path=Environment.getExternalStorageDirectory().toString()
+File.separator
+"genwoxue"
+File.separator
+System.currentTimeMillis()
+".jpg";
File file=new File(path);
if(!file.exists()){
File vDirPath = file.getParentFile();
vDirPath.mkdirs();
Toast.makeText(getApplicationContext(), "photo.jpg文件不存在!", Toast.LENGTH_LONG).show();
return;
}
try {
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);
try {
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
camera.stopPreview();
camera.startPreview();
}
};
//对焦回回调
public class AutoFocusCallbackimpl implements AutoFocusCallback{
public void onAutoFocus(boolean success,Camera camera){
if(success){
camera.takePicture(shutter, null, picture);
camera.stopPreview();
}
}
}
//快门回调
public ShutterCallback shutter=new ShutterCallback(){
public void onShutter(){
}
};
}
3、运行结果
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150351.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...