您的位置:首页 > 其它

Camera

2015-09-29 15:54 351 查看

权限--判断--打开--预览--拍照--关闭--查看

             
   |              |
   |
     -------设置图片大小
           |
   --------设置surfaceview大小
   |
   --------全屏显示     

权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>


判断: 

PackageManager packageManager = getActivity().getPackageManager();
boolean hasCamera = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)||packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)||Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD || Camera.getNumberOfCameras()>0;

打开:

打开相机
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD){
mCamera = Camera.open(0);
}else{
mCamera = Camera.open();
}


预览:

SurfaceView类实现了SurfaceHolder接口,当SurfaceView出现在屏幕上时,会创建Surface;其随SurfaceView从屏幕消失而被销毁。当Surface不存在时要保证没有任何内容要在其上绘制。(SurfaceHolder是我们与Surface对象联系的纽带,Surface对象代表着原始像素数据的缓冲区)
mSurfaceView = (SurfaceView) view.findViewById(R.id.surfaceView1);
SurfaceHolder <span style="color:#ff0000;">holder </span>= mSurfaceView.getHolder();
<span style="color:#ff0000;">holder</span>.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
<span style="color:#ff0000;">holder</span>.addCallback(new SurfaceHolder.Callback() {
<span style="color:#33cc00;">//SurfaceView从屏幕上移除,Surface也随即被销毁,通知客户端停止绘制</span>
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// surface已消失,必须停止绘制预览
if(mCamera != null){
mCamera.stopPreview();
}

}
<span style="color:#33cc00;">//包含SurfaceView的视图层级结构被放到屏幕上时调用该方法,是Surface与其客户端进行关联的地方</span>
@Override
public void surfaceCreated(SurfaceHolder holder) {
//告知camera在这个surface上显示预览
try {
if(mCamera != null){
Toast.makeText(getActivity(), "start", Toast.LENGTH_SHORT).show();
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
} catch (IOException e) {
Log.e(TAG, "error setting up preview diaplay");
}

}
<span style="color:#33cc00;">//Surface首次显示在屏幕上时调用该方法,传入参数告知Surface的像素格式以及宽高,通知客户端绘制区域有多大。</span>
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if(mCamera == null)
return;
//当surface大小改变时也要相应地改变相机预览大小
Camera.Parameters parameters = mCamera.getParameters();
Size size =g<span style="color:#996633;">etBestSupportedSize</span>(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(size.width, size.height);
size = <span style="color:#996633;">getBestSupportedSize</span>(parameters.getSupportedPictureSizes(), width, height);
parameters.setPictureSize(size.width, size.height);
mCamera.setParameters(parameters);
try {
mCamera.startPreview();
} catch (Exception e) {
Log.e(TAG, "could not start preview", e);
mCamera.release();
mCamera = null;
}

}
});

return view;
}


去掉操作栏要在Activity中进行:
@Override
protected void onCreate(Bundle savedInstanceState) {

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}


拍照:即从相机的实时预览中捕获一帧图像

Camera方法:public final void takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw,CameraPictureCallback jpeg)
实现要传入的两个接口:没实现的给NULL即可
<span style="white-space:pre">	</span>private Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {
<span style="color:#33cc00;">//当相机捕获图像时调用,此时图像数据还未处理完,可以显示一只进度条</span>
@Override
public void onShutter() {
mProgressContainer.setVisibility(View.VISIBLE);

}
};
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
<span style="color:#009900;">//JPEG版本的图像可用时调用,可以在这里<span style="background-color: rgb(255, 255, 102);">保存图片</span></span>
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Toast.makeText(getActivity(), "getting picture...", Toast.LENGTH_SHORT).show();
String filename = new Date().toString()+".jpg";
FileOutputStream outputStream = null;
boolean success = true;
try {
outputStream = getActivity().openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(data);
} catch (Exception e) {
Toast.makeText(getActivity(), "error writting to file", Toast.LENGTH_SHORT).show();
success = false;
}finally{
try {
if(outputStream != null){
outputStream.close();
}
} catch (Exception e) {
Toast.makeText(getActivity(), "error closing file", Toast.LENGTH_SHORT).show();
success = false;
}
}
if(success){
Toast.makeText(getActivity(), "JPEG saved at "+filename, Toast.LENGTH_SHORT).show();
}
FragmentManager fragmentManager = getActivity().getFragmentManager();
String path = getActivity().getFileStreamPath(filename).getAbsolutePath();
ImageFragment.newInstance(path).show(getChildFragmentManager(), "image");
}
};

关闭:在opPause()中操作

@Override
public void onPause() {
if(mCamera != null){
mCamera.release();
mCamera = null;
}
super.onPause();
}


查看:

<span style="white-space:pre">		</span>mImageView = new ImageView(getActivity());
BitmapDrawable image = PictureUtils.getScaledDrawable(getActivity(), filepath);
mImageView.setImageDrawable(image);


工具类:找出设备支持的最佳尺寸

private Size getBestSupportedSize(List<Size> sizes,int width,int height){
Size bestSize = sizes.get(0);
int largestArea = bestSize.width * bestSize.height;
for(Size size : sizes){
int area = size.width * size.height;
if(area >largestArea){
bestSize = size;
largestArea = area;
}
}
return bestSize;

}

图片处理:缩小图片、清除图片

public class PictureUtils {
public static BitmapDrawable getScaledDrawable(Activity a, String path) {
Display display = a.getWindowManager().getDefaultDisplay();
float destWidth = display.getWidth();
float destHeight = display.getHeight();

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
float scrWidth = options.outWidth;
float scrHeight = options.outHeight;

int inSampleSize = 1;
if (scrHeight > destHeight || scrWidth > destWidth) {
if (scrWidth > scrHeight) {
inSampleSize = Math.round(scrHeight / destHeight);
} else {
inSampleSize = Math.round(scrWidth / destWidth);
}
}
options = new BitmapFactory.Options();
options.inSampleSize = inSampleSize;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);

return new BitmapDrawable(a.getResources(), bitmap);
}

public static void cleanImageView(ImageView imageView){
if(!(imageView.getDrawable() instanceof BitmapDrawable))
return;
BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();
bitmapDrawable.getBitmap().recycle();
imageView.setImageDrawable(null);
}
}

注:本文代码修改自 《Android编程权威指南》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: