关于Android接入外接摄像头,首先毋庸置疑的是需要给你的app配置相应的权限

    <uses-permission android:name="android.permission.CAMERA" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

1.首先构建相应的视图view

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="${relativePackage}.${activityClass}" >    <TextureView         android:id="@+id/textureview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>    <ImageButton        android:id="@+id/play"        android:layout_width="60dp"        android:layout_height="60dp"        android:layout_centerHorizontal="true"        android:layout_alignParentBottom="true"        android:background="@drawable/ic_start"        android:contentDescription="@string/app_name"        android:layout_marginBottom="10dp"/>RelativeLayout>

2.获取到相应的camera对象,并完成拍照进行本地存储

package com.example.onecamera;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Iterator;import java.util.List;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.SurfaceTexture;import android.hardware.Camera;import android.hardware.Camera.Size;import android.media.CamcorderProfile;import android.media.MediaRecorder;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.TextureView;import android.view.TextureView.SurfaceTextureListener;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageButton;import android.widget.Toast;@SuppressWarnings("deprecation")public class MainActivity extends Activity implements SurfaceTextureListener,        OnClickListener {    private static final String TAG = MainActivity.class.getSimpleName();    private Camera mCamera;    private ImageButton mPlayButton;    private boolean isRecord;    private MediaRecorder mMediaRecorder;    private CamcorderProfile mProfile;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mPlayButton = (ImageButton) findViewById(R.id.play);        mPlayButton.setOnClickListener(this);        ((TextureView) findViewById(R.id.textureview))                .setSurfaceTextureListener(this);    }    private void takePic() {        if (mCamera != null) {            //调用抓拍摄像头抓拍            mCamera.takePicture(null, null, pictureCallback);        } else {            Log.e("TAG", "请检查摄像头!");        }    }    private Bitmap mBitmap;    public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {        @Override        public void onPictureTaken(byte[] data, Camera camera) {            Log.i("ygy", "onPictureTaken");            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式            System.out.println(df.format(new Date()));// new Date()为获取当前系统时间            String picName = df.format(new Date());            Toast.makeText(getApplicationContext(), "正在保存...", Toast.LENGTH_LONG).show();            mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);            File file = new File("/storage/emulated/0/" + picName + ".jpg");            try {                file.createNewFile();                BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));                mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);                os.flush();                os.close();                Toast.makeText(getApplicationContext(), "图像保存成功", Toast.LENGTH_LONG).show();            } catch (IOException e) {                e.printStackTrace();            }        }    };    @Override    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,                                          int height) {        mCamera = Camera.open(1);        if (mCamera != null) {            try {                mCamera.setPreviewTexture(surface);                mCamera.startPreview();            } catch (IOException e) {                Log.d("TAG", e.getMessage());            }        }    }    @Override    protected void onStop() {        if (mCamera != null) {            mCamera.stopPreview();            mCamera.release();            mCamera = null;        }        super.onStop();    }    @Override    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,                                            int height) {    }    @Override    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {        if (mCamera != null) {            mCamera.stopPreview();            mCamera.release();            mCamera = null;        }        return false;    }    @Override    public void onSurfaceTextureUpdated(SurfaceTexture surface) {    }    @Override    public void onClick(View v) {        if (mCamera == null) {            return;        }        takePic();    }}

在完成以上操作之后仍无法调用到摄像头,请注意一下方法:mCamera = Camera.open(1); 这个并不是所有的android系统都是这个,有可能是mCamera = Camera.open(0); 这个根据实际情况来定

如果你做了以上操作成功了,但是移入到项目里面发现并不能行,那么请先检查你的camera是否有预览视图TextureView,如果你在布局文件里面没有放置TextureView来给camera显示,那么可能会导致你的camera无法进行拍照(我就是遇到这个坑,然后一直找不到原因,后来配置了一个宽高1dp的视图放在父布局里面就可以正常使用拍照了)。

demo:http://download.csdn.net/download/d38825/10166750

更多相关文章

  1. android中文api(89)——ViewManager
  2. Android中的FILL_PARENT与WRAP_CONTENT的区别
  3. android用户界面-组件Widget-地图视图MapView
  4. Android(安卓)中文API(86)——ResourceCursorAdapter
  5. android用户界面-组件Widget-画廊视图Gallery
  6. android 中文api (62) —— ViewSwitcher.ViewFactory
  7. Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
  8. android api 中文 (74)—— AdapterView.AdapterContextMenuInfo
  9. Android(安卓)如何开发 Bottom Navigation 风格

随机推荐

  1. android 在init。rc中配置socket及其使用
  2. WP7、Android、iOS技术层面大比拼
  3. Android推荐学习路线图
  4. phoneGap开发android,JS调用android方法/
  5. android中Intent传值与Bundle传值详解
  6. Android系统信息获取 之十四:获取WIFI热点
  7. 怎样用 C/C++ 开发一个原生程序运行在 An
  8. Android通过百度地图API用Service和Alarm
  9. Android input输入设备键值从底层到应用
  10. android直接读取项目中的sqlite数据库