Đ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>
Bạn đã giải quyết được sự cố chưa? –
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 –
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. –