2013-02-15 45 views
11

Điều đầu tiên đầu tiên: lỗi sau xuất hiện trên 2 HTC Desires khác nhau, một với 2.3.3, một với 4.0.4.takePicture thất bại với lỗi liên quan đến đống

tôi nhận được thông báo lỗi sau khi cố gắng gọi .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 

các PictureCallback tương ứng là không bao giờ gọi sau khi lỗi này.

Các giải thích duy nhất tôi có thể tìm thấy là a) startPreview không được gọi; b) cố chụp ảnh quá nhanh (trước khi gọi lại ảnh); c) không thiết lập những ứng dụng đúng/quyền

tôi làm một) ở đây, trong onResume() của FullscreenActivity tôi:

//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) không nên áp dụng đối với tôi khi tôi chỉ cố gắng lấy một bức tranh đơn

c): sử dụng phần của tôi manifest:

<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"/> 

Một số mã bổ sung:

Nơi tôi gọi takePicture (lưu ý rằng bản ghi ở đây có nghĩa là AsyncTask được phép gọi takePicture một lần nữa sau khi hoàn thành. Không liên quan tuy nhiên như lỗi vẫn còn mà không bao giờ gọi 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"); 
     } 

    } 
}); 

EDIT: Sau một chút thay đổi cách bố trí của tôi pictureCallback là cuối cùng gọi và tôi nhận được dữ liệu hợp lệ (yay), tuy nhiên lỗi vẫn còn. Đây là bố cục hiện tại của tôi:

<?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

Bạn đã giải quyết được sự cố chưa? –

+0

Bạn có gắn thẻ SD khi mã này thực thi không? http://forum.xda-developers.com/showthread.php?t=819037#6 –

+0

Tôi đang lưu các hình ảnh tôi chụp vào sdcard để người ta giả định rằng nó được gắn chính xác. Tôi chỉ cố gắng un- và remounting nhưng thông báo lỗi vẫn tồn tại. –

Trả lời

1

Tôi sẽ nói rằng bạn có một số lỗi trong các bước.

Bạn nên xem ví dụ này: cw-android - camera preview (dòng 127+). Tôi đoán rằng bạn đang không chờ đợi cho đến khi lần đầu tiên surfaceChanged trong SurfaceHolder.Callback của bạn, nơi thường bạn nên gọi startPreview() phương pháp, do đó giải thích của bạn

a) startPreview không được gọi;

b) cố gắng chụp ảnh quá nhanh (trước khi gọi lại hình ảnh được gọi);

có thể là chính xác.

+0

Đó là những gì tôi hiện đang làm và sự thất bại vẫn tồn tại.Gọi startPreview quá sớm gây ra một lỗi khác mà tôi tin rằng –

+0

Bạn có thể đính kèm mã đầy đủ không. Tôi có thể thử nghiệm trên HTC Desire của tôi với Android 2.3.3, vì vậy chúng tôi có thể loại bỏ các vấn đề về phần cứng hoặc nhà cung cấp nếu thông báo vẫn tồn tại :) – Tomo

Các vấn đề liên quan