2013-02-15 80 views
11

首先要做的事:在2个不同的HTC Desires上出现以下错误,一个使用2.3.3,一个使用4.0.4。takePicture失败,堆相关错误

我在尝试调用.takePicture如果出现以下错误信息:

E/MemoryHeapBase(104): error opening /dev/pmem_camera: No such file or directory 
E/QualcommCameraHardware(104): failed to construct master heap for pmem pool /dev/pmem_camera 
E/QualcommCameraHardware(104): initSnapshot X failed with pmem_camera, trying with pmem_adsp 

相应PictureCallback这个错误后,则永远不会调用。

我能找到的唯一解释是a)startPreview没有被调用; b)试图快速拍摄照片(在图片回调被调用之前); c)不设置正确的使用/权限

我做了)这里,在的onResume()我FullscreenActivity的

//open the camera resource 
cam = Camera.open(); 

Camera.Parameters params = cam.getParameters(); 
//change Parameters 
params.setJpegQuality(100);//best quality 
params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
//params.setZoom(2); 
List<Size> supportedPreviewSizes = cam.getParameters().getSupportedPreviewSizes(); 
params.setPreviewSize(supportedPreviewSizes.get(0).width, supportedPreviewSizes.get(0).height); 
cam.setParameters(params); 

SurfaceView sv = (SurfaceView)this.findViewById(R.id.surfaceView1); 
SurfaceHolder mHolder = sv.getHolder(); 
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
mHolder.setSizeFromLayout(); 
mHolder.addCallback(this); 

try { 
    cam.setPreviewDisplay(mHolder); 
} catch (IOException e) { 
    Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
} 

//Log.d(TAG, "Starting Preview"); 
cam.startPreview(); 

B)不应适用于我,因为我只是试图采取单张图片

C):使用部分的我清单

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="8" /> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.FLASHLIGHT"/> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus"/> 
<uses-feature android:name="android.hardware.camera.flash"/> 

一些额外的代码:

我在哪里调用takePicture(注意这里的记录意味着允许AsyncTask在它完成后再次调用takePicture。然而无关而没有调用的AsyncTask的错误仍然存​​在):

findViewById(R.id.snap_button).setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     recording = !recording; 

     Button btn = (Button)findViewById(R.id.snap_button); 
     if(recording) { 
      //update buttontext 
      btn.setText("Stop"); 
      //start recording by taking a picture 
      cam.takePicture(null,null, mPicture); 

     } else { 
      //update button text 
      btn.setText("Start"); 
     } 

    } 
}); 

编辑: 略有改变我的布局pictureCallback最后调用,我得到有效数据(耶)之后,但错误依然存在。这是我目前的布局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" > 

    <SurfaceView 
     android:id="@+id/surfaceView1" 
     android:layout_width="0dp" 
     android:layout_height="369dp" 
     android:layout_weight="1.55" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <Button 
      android:id="@+id/snap_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Capture" /> 

     <ProgressBar 
      android:id="@+id/progressBar1" 
      style="?android:attr/progressBarStyleLarge" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

    </LinearLayout> 

</LinearLayout> 
+1

你解决了这个问题吗? – 2013-02-28 08:54:29

+0

执行此代码时是否安装了SD卡? http://forum.xda-developers.com/showthread.php?t=819037#6 – 2013-03-01 18:24:51

+0

我正在将所拍摄的照片保存到SD卡上,因此可以认为它已正确安装。我只是尝试un-and remounting,但错误消息仍然存在。 – 2013-03-06 14:06:43

回答

1

我会说你有一些步骤中的错误。

你应该看看这个例子: cw-android - camera preview(127+行)。我猜你是不是在你的SurfaceHolder.Callback,在那里通常你应该调用startPreview()方法等到第一次surfaceChanged,因此你的解释

一)startPreview不叫;

b)试图拍照太快(在图片回调被调用之前);

很可能都是正确的。

+0

这就是我目前正在做的和错误消息仍然存在。调用startPreview过早导致一个不同的错误,我相信 – 2013-03-21 13:02:15

+0

你可以附上完整的代码。我可以在Android 2.3.3上测试我的HTC Desire,如果消息持续存在,我们可以消除硬件或供应商问题:) – Tomo 2013-03-21 17:41:19