【发布时间】:2018-08-19 11:15:30
【问题描述】:
我跟随https://developer.android.com/guide/topics/media/camera.html 激活了android 4 的自定义相机,但我的捕捉功能完全不起作用。以下是我的代码:
cameraf.java:
public class cameraf extends AppCompatActivity{
private Preview mPreview;
private Camera mCamera;
private static final String TAG = "Myact";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cameraf);
mCamera = getCameraInstance();
mPreview = new Preview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.setOnTouchListener(new View.OnTouchListener(){
public boolean onTouch(View v, MotionEvent event){
Log.v(TAG, "will now take picture");
mCamera.takePicture(null, null, mPicture);
return true;
}
});
preview.addView(mPreview);
}
private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.v(TAG, "Getting output media file");
File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null) {
Log.v(TAG, "Error creating output file");
return;}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.v(TAG, e.getMessage());
} catch (IOException e) {
Log.v(TAG, e.getMessage());}
}
};
public static final int MEDIA_TYPE_IMAGE = 1;
private static File getOutputMediaFile(int type){
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else {
return null;}
return mediaFile;
}
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
}
catch (Exception e){
}
return c; // returns null if camera is unavailable
}
public class Preview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public Preview(Context context, Camera camera) {
super(context);
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.setDisplayOrientation(90);
Camera.Parameters params = mCamera.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
} catch (IOException exception) {
mCamera.release();
mCamera = null;}
}
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
mCamera.startPreview();
}
}
private void releaseCamera(){
if (mCamera != null){
mCamera.release(); // release the camera for other applications
mCamera = null;
}
}
}
我在清单中添加了权限 uses-permission android:name="android.permission.CAMERA",uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
但是从上面的代码它可以让我打开相机但是当我点击屏幕时它变成错误并且无法存储图像。所以任何人都可以分享我的想法吗?
【问题讨论】:
-
添加 android:name="android.permission.READ_EXTERNAL_STORAGE" 并请显示您遇到的错误的堆栈跟踪。
-
是的,我已经添加了,但问题还是一样,所以我在发布这个论坛之前删除了,关于错误显示在我的手机中,它写道不幸的是相机应用程序已停止
-
Android-Studio中有一个logcat部分,你可以看看那里的stacktrace。
-
嗨,我已经从 logcat 上传了我的错误
-
@RahulKumar 嗨,你有什么想法吗?如果可以请分享我的想法,谢谢,这让我变成了麻烦
标签: java android android-camera