当前位置: 首页 > 知识库问答 >
问题:

mCamera.take图片(null, null, mPicture)不工作

祁通
2023-03-14

我按照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;
    }
}
}

我已经添加了清单中的权限,这是使用权限Android:名称="android.permission.相机",使用权限Android:名称="android.permission.WRITE_EXTERNAL_STORAGE"

但从上面的代码可以让我打开相机,但当我在屏幕上点击它成为错误,无法存储图像。所以有人能和我分享想法吗?

共有1个答案

呼延运恒
2023-03-14

您看到的故障可能会发生,因为您没有设置图片大小。有些设备需要这样做。

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

您无法设置从曲面视图大小派生的预览大小…实际上,您没有:您的调用

parameters.setPreviewSize(w, h);

后面不是

mCamera.setParameters(parameters);
 类似资料:
  • 我最近开始学习oracle和SQL。在学习过程中,我遇到了几个问题,我的朋友在一次采访中被问到。 此查询生成Employees表中的所有行。至于我所理解的Oracle在列中搜索数据,那么,NULL,这里是作为列名处理的吗?我说Oracle在列中搜索数据是正确的吗?Oracle怎么会给出这个查询中的所有行呢?在WHERE子句中,条件的左手边不一定是列名吗?它不应该抛出一个错误吗? 不给出选定的行。

  • 问题内容: 我必须编写一个例程,如果变量的类型为,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为或。 第一个实现是因为我认为没有数字会使算术表达式为假,但是由于计算为真,所以这是错误的。然后,我得知行为类似于0,并且以下表达式均被评估为true。 当然不是0。被评估为false。这使看似重言式的表达成为错误。 为什么实际上不是0,却像0? 问题答案: 您真正的问题似乎是: 为什么:

  • 问题内容: 我正在阅读本文: 在SQL中获取null == null 共识是,当尝试测试两个(可空)sql列之间的相等性时,正确的方法是: 当A和B为时,(A = B)仍返回FALSE,因为NULL不等于NULL。这就是为什么需要额外检查的原因。 检验不平等情况如何?经过以上讨论,我认为要测试不平等,我需要做一些类似的事情: 但是,我注意到这不是必需的(至少在informix 11.5上没有),我

  • 问题内容: 我希望在可为空的列上搜索数据库表。有时,我要搜索的值本身就是NULL。由于Null等于零,甚至NULL,所以说 将失败。现在我不得不求助于 有没有更简单的说法呢? (如果重要的话,我正在使用Oracle) 问题答案: 您可以做IsNull或NVL东西,但这只会使引擎做更多的工作。您将调用函数进行列转换,然后必须将结果进行比较。 用你所拥有的

  • Jasmine提供了一种不同的方法来检查实际输出是否为Null,已定义或未定义。 在本章中,我们将学习如何实现不同的Jasmine方法来检查上述场景。 toBedefined() 此匹配器用于检查代码中的任何变量是否已预定义。 让我们根据这个例子修改我们的customerMatcherSpec.js文件。 currentVal = 0; describe("Different Methods

  • 大部分现代语言使用某些方法去解决了这个问题,Kotlin的方法跟别的相似的语言比是相当另类和不同的。但是黄金准则还是一样:如果变量是可以是null,编译器强制我们去用某种方式去处理。 指定一个变量是可null是通过在类型的最后增加一个问号。因为在Kotlin中一切都是对象(甚至是Java中原始数据类型),一切都是可null的。所以,当然我们可以有一个可null的integer: val a: In