自定义相机android

我想在活动中使用camera preview 。 我想添加图像(表面视图上的透明框架)。 我试着下面的代码,以便我可以很容易地自定义XML布局:

 package com.demo; import java.io.IOException; import android.app.Activity; import android.graphics.PixelFormat; import android.hardware.Camera; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.Toast; public class CameraDemoActivity extends Activity implements SurfaceHolder.Callback{ /** Called when the activity is first created. */ Camera camera; SurfaceView surfaceView; SurfaceHolder surfaceHolder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getWindow().setFormat(PixelFormat.UNKNOWN); surfaceView = (SurfaceView)findViewById(R.id.surfaceview); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); camera = Camera.open(); if(camera!=null){ try { camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); } catch (IOException e) { Toast.makeText(this, (CharSequence) e, Toast.LENGTH_LONG).show(); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } } 

这是我的清单:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.demo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".CameraDemoActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android:hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> </manifest> 

这是我的布局:

 <?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" > <SurfaceView android:id="@+id/surfaceview" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </LinearLayout> 

不知道为什么camera预览不显示?

Solutions Collecting From Web of "自定义相机android"

使用这个代码

PreviewDemo.java

 public class PreviewDemo extends Activity implements OnClickListener { private SurfaceView preview = null; private SurfaceHolder previewHolder = null; private Camera camera = null; private boolean inPreview = false; ImageView image; Bitmap bmp, itembmp; static Bitmap mutableBitmap; PointF start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; File imageFileName = null; File imageFileFolder = null; private MediaScannerConnection msConn; Display d; int screenhgt, screenwdh; ProgressDialog dialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.preview); image = (ImageView) findViewById(R.id.image); preview = (SurfaceView) findViewById(R.id.surface); previewHolder = preview.getHolder(); previewHolder.addCallback(surfaceCallback); previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); previewHolder.setFixedSize(getWindow().getWindowManager() .getDefaultDisplay().getWidth(), getWindow().getWindowManager() .getDefaultDisplay().getHeight()); } @Override public void onResume() { super.onResume(); camera = Camera.open(); } @Override public void onPause() { if (inPreview) { camera.stopPreview(); } camera.release(); camera = null; inPreview = false; super.onPause(); } private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { Camera.Size result = null; for (Camera.Size size: parameters.getSupportedPreviewSizes()) { if (size.width <= width && size.height <= height) { if (result == null) { result = size; } else { int resultArea = result.width * result.height; int newArea = size.width * size.height; if (newArea > resultArea) { result = size; } } } } return (result); } SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { public void surfaceCreated(SurfaceHolder holder) { try { camera.setPreviewDisplay(previewHolder); } catch (Throwable t) { Log.e("PreviewDemo-surfaceCallback", "Exception in setPreviewDisplay()", t); Toast.makeText(PreviewDemo.this, t.getMessage(), Toast.LENGTH_LONG) .show(); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters parameters = camera.getParameters(); Camera.Size size = getBestPreviewSize(width, height, parameters); if (size != null) { parameters.setPreviewSize(size.width, size.height); camera.setParameters(parameters); camera.startPreview(); inPreview = true; } } public void surfaceDestroyed(SurfaceHolder holder) { // no-op } }; Camera.PictureCallback photoCallback = new Camera.PictureCallback() { public void onPictureTaken(final byte[] data, final Camera camera) { dialog = ProgressDialog.show(PreviewDemo.this, "", "Saving Photo"); new Thread() { public void run() { try { Thread.sleep(1000); } catch (Exception ex) {} onPictureTake(data, camera); } }.start(); } }; public void onPictureTake(byte[] data, Camera camera) { bmp = BitmapFactory.decodeByteArray(data, 0, data.length); mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true); savePhoto(mutableBitmap); dialog.dismiss(); } class SavePhotoTask extends AsyncTask < byte[], String, String > {@Override protected String doInBackground(byte[]...jpeg) { File photo = new File(Environment.getExternalStorageDirectory(), "photo.jpg"); if (photo.exists()) { photo.delete(); } try { FileOutputStream fos = new FileOutputStream(photo.getPath()); fos.write(jpeg[0]); fos.close(); } catch (java.io.IOException e) { Log.e("PictureDemo", "Exception in photoCallback", e); } return (null); } } public void savePhoto(Bitmap bmp) { imageFileFolder = new File(Environment.getExternalStorageDirectory(), "Rotate"); imageFileFolder.mkdir(); FileOutputStream out = null; Calendar c = Calendar.getInstance(); String date = fromInt(c.get(Calendar.MONTH)) + fromInt(c.get(Calendar.DAY_OF_MONTH)) + fromInt(c.get(Calendar.YEAR)) + fromInt(c.get(Calendar.HOUR_OF_DAY)) + fromInt(c.get(Calendar.MINUTE)) + fromInt(c.get(Calendar.SECOND)); imageFileName = new File(imageFileFolder, date.toString() + ".jpg"); try { out = new FileOutputStream(imageFileName); bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); scanPhoto(imageFileName.toString()); out = null; } catch (Exception e) { e.printStackTrace(); } } public String fromInt(int val) { return String.valueOf(val); } public void scanPhoto(final String imageFileName) { msConn = new MediaScannerConnection(PreviewDemo.this, new MediaScannerConnectionClient() { public void onMediaScannerConnected() { msConn.scanFile(imageFileName, null); Log.i("msClient obj in Photo Utility", "connection established"); } public void onScanCompleted(String path, Uri uri) { msConn.disconnect(); Log.i("msClient obj in Photo Utility", "scan completed"); } }); msConn.connect(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0) { onBack(); } return super.onKeyDown(keyCode, event); } public void onBack() { Log.e("onBack :", "yes"); camera.takePicture(null, null, photoCallback); inPreview = false; } @Override public void onClick(View v) { } } 

Preview.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <android.view.SurfaceView android:id="@+id/surface" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout> 

使用设备菜单button拍照。

在Manifest文件中添加权限

选中图库中的旋转文件夹。