mCamera.takePicture(null, null, mPicture) 不起作用

Posted

技术标签:

【中文标题】mCamera.takePicture(null, null, mPicture) 不起作用【英文标题】:mCamera.takePicture(null, null, mPicture) does not work 【发布时间】: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 嗨,你有什么想法吗?如果可以请分享我的想法,谢谢,这让我变成了麻烦 【参考方案1】:

您看到的失败可能是因为您没有设置图片大小。有些设备需要这个。

请注意,您必须选择支持的尺寸之一,并确保图片尺寸和预览尺寸同步(即具有相同的纵横比)。

您不能设置从表面视图大小派生的预览大小……实际上,您没有:您的电话

parameters.setPreviewSize(w, h);

后面没有

mCamera.setParameters(parameters);

【讨论】:

你到底尝试了什么?触摸预览拍照时是否看到相机预览?也许你的注意力还没有准备好?查看***.com/a/26261473/192373 了解FOCUS_MODE_CONTINUOUS_PICTURE 的一些特殊情况。 我现在移除焦点功能也无法使用,它显示这个 E/TelephonyProvider: iTelephony is null!!! TelephonyProvider 的地址在哪里?

以上是关于mCamera.takePicture(null, null, mPicture) 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SetTimer(NULL,NULL,UINT,NULL)

三个问题: NULL - NULL 定义了吗? (uintptr_t)NULL - (uintptr_t)NULL 定义了吗? [复制]

getCipherSuite() 返回 SSL_NULL_WITH_NULL_NULL

剑指:二叉树的镜像

PHP之null

!= null 和 !== null 有啥区别? [复制]