我想通过从相机表面视图类调用函数来获取位图,但我总是得到这样的错误:
任何帮助将不胜感激〜
java.lang.NullPointerException
at com.etoff.appsopengl.CameraSurfaceView.setCapture(CameraSurfaceView.java:58)
at com.etoff.appsopengl.Stage$MyRenderer.onDrawFrame(Stage.java:168)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1467)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1221)
这是编码调用编码的Stage类:
public class Stage extends GLSurfaceView {
CameraSurfaceView csv;
Bitmap imgB;
public Stage(Context context, AttributeSet attrs) {
super(context, attrs);
csv = new CameraSurfaceView(context);
}
//inside renderer I call the function
if(c==true){
csv.setCapture();
imgB = csv.getBitmap();
}
}
这是CameraSurfaceView类编码:
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
Camera mCamera;
boolean isPreviewRunning = false;
Bitmap mBitmap;
CameraSurfaceView(Context context) {
super(context);
SurfaceHolder mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
synchronized(this) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
Log.e("Camera", "mCamera.setPreviewDisplay(holder);");
}
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
synchronized(this) {
try {
if (mCamera!=null) {
mCamera.stopPreview();
isPreviewRunning=false;
mCamera.release();
}
} catch (Exception e) {
Log.e("Camera", e.getMessage());
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
}
public void setCapture(){
mCamera.takePicture(null,null,mPicture);
}
public Bitmap getBitmap(){
return mBitmap;
}
private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inMutable = true;
mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);
}
};
}
答案 0 :(得分:0)
使用此代码获取您的后置摄像头ID
private int findFrontFacingCamera() {
int cameraId = -1;
// Search for the front facing camera
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i < numberOfCameras; i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
Log.d(DEBUG_TAG, "Camera found");
cameraId = i;
break;
}
}
return cameraId;
}
并像这样使用
// do we have a camera?
if (!getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG)
.show();
} else {
int cameraId = findFrontFacingCamera();
if (cameraId < 0) {
Toast.makeText(this, "No front facing camera found.",
Toast.LENGTH_LONG).show();
} else {
mCamera = Camera.open(cameraId);
}
}