2 w530680217 w530680217 于 2016.02.25 18:26 提问

Android Camera2的使用到底是哪里错了?

图片说明
代码如下:

public class CameraTwoActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {

@Bind(R.id.textureview)
android.view.TextureView mPreviewView;
private Handler mHandler;
private HandlerThread mThreadHandler;
private Size mPreviewSize=null;
private CaptureRequest.Builder mPreviewBuilder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera_activity);
    ButterKnife.bind(this);
    mThreadHandler = new HandlerThread("CAMERA2");
    mThreadHandler.start();
    mHandler = new Handler(mThreadHandler.getLooper());
    mPreviewView.setSurfaceTextureListener(this);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
    try {
        //获得CameraManager
        CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        //获得属性
        CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics("0");
        //支持的STREAM CONFIGURATION
        StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        //显示的size
        mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];
        //打开相机
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        cameraManager.openCamera("0", mCameraDeviceStateCallback, mHandler);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
    return false;
}
//TextureView.SurfaceTextureListener
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
    @Override
    public void onOpened(CameraDevice camera) {
        try {
            startPreview(camera);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onDisconnected(CameraDevice camera) {
    }
    @Override
    public void onError(CameraDevice camera, int error) {
    }
};
//开始预览,主要是camera.createCaptureSession这段代码很重要,创建会话
private void startPreview(CameraDevice camera) throws CameraAccessException {
    SurfaceTexture texture = mPreviewView.getSurfaceTexture();
    texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
    Surface surface = new Surface(texture);
    Log.i(getClass().getName(),"1111");
    try {
        mPreviewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    } catch (CameraAccessException e) {
        Log.i(getClass().getName(),"2222");
        e.printStackTrace();
    }
    Log.i(getClass().getName(),"3333");
    mPreviewBuilder.addTarget(surface);
    camera.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, mHandler);
}
private CameraCaptureSession.StateCallback mSessionStateCallback = new CameraCaptureSession.StateCallback() {
    @Override
    public void onConfigured(CameraCaptureSession session) {
        try {
            updatePreview(session);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onConfigureFailed(CameraCaptureSession session) {
    }
};
private void updatePreview(CameraCaptureSession session) throws CameraAccessException {
    session.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler);
}

}

4个回答

u011249920
u011249920   2016.02.26 10:18

As the log said, you are trying to get width from a Null object.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
mPreviewSize = null

w530680217
w530680217 开始就设置为null了。中间调用的时候是有值输出的我Log打印过。mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];执行后是有数据的。
2 年多之前 回复
lxk_1993
lxk_1993   Rxr 2016.02.26 11:03

空指针错误 你可以在打印的logcat信息的下面 有一个 你的类的代码行 提示 会 定位到 哪一行的

w530680217
w530680217 所有的错误都在这里,没有提示定位的绿色类。全是系统的一些类
2 年多之前 回复
oQingShuYe
oQingShuYe   2016.03.01 08:29

楼主,问题解决了没?这个camera2我也不会用。
你的代码里有一句。mThreadHandler = new HandlerThread("CAMERA2");
我看到SDK->Samples->media->Camera2Basic里用的是 new HandlerThread("CameraBackground")

liyuanjinglyj
liyuanjinglyj 回复青树叶: 这就是起个名字,是一样的。
2 年多之前 回复
enjoyGai
enjoyGai   2017.02.16 11:10

建议去下gogle的demo,改改,省事,不要自己写!还有你这明显是空指针了,debug调一下吧,

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android Camera2 拉伸问题
1. 前言 Camera2在一些低端机器上出现拉伸问题,当然首先排除不是笔者低级错误设置的分辨率有问题。 2. 拉伸问题详细描述 Camera2在某些机型上画面拉伸,表象是我们设置16:9的输出(当然是查询到支持的分辨率),但是Camera实际输出的是4:3。 整个过程如下: 获取Camera支持的输出分辨率 StreamConfigurationMap st...
Android4.4之Camera2预览流程(从APP到Driver)
1.APP调用   packages/apps/Camera2/src/com/android/camera/PhotoModule.java       private void startPreview() {         Log.v(TAG, "startPreview");         mCameraDevice.startPreviewAsync();
android camera2 的基础应用
之前一直用android camera,但现在市面上新出的手机都是支持camera2的,项目要求也是运用camera2,于是自己学习了下,将一些知识点罗列出来,以供复习和大家参考。 一、camera2的预览流程 1、获取相机manager,获得相机ID列表(通过ID选择开启的相机) 2、获取画面传感器的面积,
Android Camera2 拍照(二)——使用TextureView
上一篇博文简单介绍了使用Camera2 API拍摄照片,并使用SurfaceView作为预览界面。实际上,相对于SurfaceView, TextureView更适合用于视频和拍摄照片。SurfaceView也有它的使用场合,这将在另外一篇中阐述。本文将使用TextureView作为预览界面,再次向大家展示Camera2 API的简单应用。 1,定义TextureView作为预览界面 在布局文
Android camera2使用
前言 android.hardware.camera2包提供了与设备关联的相机的接口。它替代了之前的相机接口Camera类。 博主阅读了android官方的camera2的demo,发现camera2的使用较Camera要复杂一些,但功能更强大。纸上得来终觉浅,于是自己也写了个demo,实现了自动对焦拍照。 功能虽然简单,但是代码一大串,并且在实现的过程中,也发现了一些值得注意的问题。 思
Android Camera2 Mediacodec编码
Camera2 TextureView 图像预览,ImageReader 拍照 MediaCodec 同步(线程方法 method2)/异步(回调 method1)视频编码、保存为.264文档public class SurfaceTextureCamera2Activity extends Activity implements TextureView.SurfaceTextureListen
Android.Camera2相机超详细讲解
Android.Camera2相机超详细讲解在API21中Google就发布了Camera2类来取代Camera类,那么这个Camera2类到底改变了那些地方呢,我们来看看
Android使用Camera2打造自定义相机
从5.0开始(API Level 21),可以完全控制Android设备相机的新api Camera2(android.hardware.Camera2)被引入了进来。在以前的Camera api(android.hardware.Camera)中,对相机的手动控制需要更改系统才能实现,而且api也不友好。不过老的Camera API在5.0上已经过时,在未来的app开发中推荐的是Camera2 A
Android之Camera2预览流程(APP到Driver层)
花了两天时间看Android Binder机制,然后花了一下午的时间,跟了从APP到Driver Camera2的预览流程,拿出来分享备忘,欢迎下载!
Android音视频-视频采集(Camera2功能实现)
这一篇文章我们要实现Camera实现的等一些功能。熟悉Camera2API的使用,着重了解我们前面没有深入了解的视频录制相关的内容。 基本功能实现 切换摄像头 这个的实现和Camera API的步骤一摸一样。只是换了一个API而已。Camera是通过Camera.CameraInfo去获取相机,Camera2通过CameraManger去获取设备相机。关键代码如下: priva