请教Android大牛!编写Android Camera相机相关功能程序,出现了一个十分奇怪的问题(关于setType这个过期方法),搞了几天没解决

acmwozuiniu 2012-04-06 07:03:17
程序功能:编写一个简易的相机程序,将相片保存,另外还要在图片Canvas画一个矩形(或者用其他的形状标准人脸,人眼等)
问题是:
1、如果没有这句:(mCamSH是SurfaceHolder类型,用于显示相机的图片)mCamSH.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
出现以下错误:
04-06 10:51:28.403: ERROR/CameraService(34): registerBuffers failed with status -38
04-06 10:51:28.412: ERROR/我的调试:(360): startPreview failed


2、如果有了这句以后,可以启动预览功能,但是却出现以后绘图问题:
04-06 11:00:26.042: ERROR/AndroidRuntime(607): android.view.SurfaceHolder$BadSurfaceTypeException: Surface type is SURFACE_TYPE_PUSH_BUFFERS

求助各位大牛,指点一二,小弟为这个问题纠结一个多礼拜了,还没有头绪,求大家帮忙啊,感激不尽!

我的源代码如下:复制就可以运行
TestDemoCamera.java
package com.wlj.media;

import java.io.IOException;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.FrameLayout;

public class TestCameraDemo extends Activity implements SurfaceHolder.Callback {
private static final String TAG = "我的调试:";
private Camera mCam;
private SurfaceView mCamSV;
private SurfaceHolder mCamSH=null;
private byte[] mFrame; //保留照片数据
private int mFrameWidth,mFrameHeight;



@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.surface_camera);
//初始设置相机参数
initCamera();
}

private void initCamera() {
mCamSV = (SurfaceView)findViewById(R.id.surface_camera);
mCamSH = mCamSV.getHolder();
mCamSH.addCallback(this);
//请注意这一行 问题所在
mCamSH.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
public void onDestroy() {
stopCamera();
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
startCamera(holder, width, height);
}

public void surfaceCreated(SurfaceHolder holder) {
mCam = Camera.open();

Camera.Parameters p = mCam.getParameters();
mFrameWidth = p.getPreviewSize().width;
mFrameHeight = p.getPreviewSize().height;
mCam.setPreviewCallback(new PreviewCallback(){
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
synchronized (mCamSV) {
Log.i("TAG","mFrame:data="+(data.length));
mFrame = data;
Paint myPaint=new Paint();
myPaint.setColor(Color.GREEN);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3);

//获取预览的图片,并且画图,画矩形
Canvas canvas = mCamSH.lockCanvas();
Bitmap bmp = dataToBmp(mFrame);
if (canvas != null) {
canvas.drawBitmap(bmp, 0,0, null);
canvas.drawRect(10,10,100,100, myPaint);
mCamSH.unlockCanvasAndPost(canvas);
}
}
}});
try {
mCam.setPreviewDisplay(holder);
} catch (IOException e) {
Log.e(TAG,e.getMessage());
}

}

public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub

}




private void startCamera(SurfaceHolder sh, int width, int height) {
try{
mCam.startPreview();
}catch(Exception e)
{
Log.e(TAG,e.getMessage());
}
}

private void stopCamera() {
mCamSH.removeCallback(this);
mCam.stopPreview();
mCam.release();
}


Bitmap dataToBmp(byte[] data)
{
int frameSize = getFrameWidth() * getFrameHeight();
int[] rgba = new int[frameSize];
for (int i = 0; i < getFrameHeight(); i++)
for (int j = 0; j < getFrameWidth(); j++) {
int y = (0xff & ((int) data[i * getFrameWidth() + j]));
int u = (0xff & ((int) data[frameSize + (i >> 1) * getFrameWidth() + (j & ~1) + 0]));
int v = (0xff & ((int) data[frameSize + (i >> 1) * getFrameWidth() + (j & ~1) + 1]));
y = y < 16 ? 16 : y;

int r = Math.round(1.164f * (y - 16) + 1.596f * (v - 128));
int g = Math.round(1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
int b = Math.round(1.164f * (y - 16) + 2.018f * (u - 128));

r = r < 0 ? 0 : (r > 255 ? 255 : r);
g = g < 0 ? 0 : (g > 255 ? 255 : g);
b = b < 0 ? 0 : (b > 255 ? 255 : b);
//565
// r = r < 0 ? 0 : (r > 31 ? 31 : r);
// g = g < 0 ? 0 : (g > 63 ? 63 : g);
// b = b < 0 ? 0 : (b > 31 ? 31 : b);
rgba[i * getFrameWidth() + j] = 0xff000000 + (b << 16) + (g << 8) + r;
}
Bitmap bmp = null;
try {
bmp = Bitmap.createBitmap(rgba,getFrameWidth(), getFrameHeight(), Bitmap.Config.RGB_565);
} catch (Exception e) {
Log.e(TAG,"bmp图获取失败");
}
return bmp;
}

private int getFrameWidth() {
// TODO Auto-generated method stub
return this.mFrameWidth;
}

private int getFrameHeight() {
// TODO Auto-generated method stub
return this.mFrameHeight;
}

}



surface_camera.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surface_camera"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</FrameLayout>


AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wlj.media"
android:versionCode="1"
android:versionName="1.0"

>
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true"
>
<activity android:name=".TestCameraDemo"
android:label="相机示例"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
</manifest>


...全文
1225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
马俊海 2014-04-18
  • 打赏
  • 举报
回复
最后怎么解决的,求发QQ:569155515
acmwozuiniu 2013-09-28
  • 打赏
  • 举报
回复
应该是使用View实现SurfaceHolder等接口,而不是Activity class FaceView extends View implements Camera.PreviewCallback,PictureCallback class Preview extends SurfaceView implements SurfaceHolder.Callback
start_baby 2013-03-12
  • 打赏
  • 举报
回复
我也遇到这个问题,设置SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS后,没法再预览回调中用Canvas绘制该图片来,求解...
maggiccrystal_3 2012-11-12
  • 打赏
  • 举报
回复
SURFACE_TYPE_PUSH_BUFFERS 不能绘图的,楼主你这中方式可以?问题解决没有?我用了两个suferface 但是比较耗内存,不知道你种是否可以?
acmwozuiniu 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
建议看下ZXING或者OPENCV的相机相关代码
[/Quote]我看了,但是运行还是有类似错误的
metapipe 2012-04-06
  • 打赏
  • 举报
回复
建议看下ZXING或者OPENCV的相机相关代码
acmwozuiniu 2012-04-06
  • 打赏
  • 举报
回复
有人在吗
acmwozuiniu 2012-04-06
  • 打赏
  • 举报
回复
被这个问题搞得纠结挂了

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧