Android 照相机的实例应用

Android 照相机的实例应用

关键技术:

SurfaceHolder.Callback

public class MyCameraDemo extends Activity {
  private SurfaceView surface = null ;
  private Button but = null ;
  private SurfaceHolder holder = null ;
  private Camera cam = null ;
  private boolean previewRunning = true ;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.setContentView(R.layout.main);
    this.but = (Button) super.findViewById(R.id.but) ;
    this.surface = (SurfaceView) super.findViewById(R.id.surface) ; 

    this.holder = this.surface.getHolder() ;
    this.holder.addCallback(new MySurfaceViewCallback()) ;
    //设置缓冲类型
    this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ;
    //设置分辨率
    this.holder.setFixedSize(600, 350); 

    this.but.setOnClickListener(new OnClickListenerImpl()) ;
  }
  private class OnClickListenerImpl implements OnClickListener { 

    @Override
    public void onClick(View v) {
      if(MyCameraDemo.this.cam != null) {
        //自动对焦
        MyCameraDemo.this.cam.autoFocus(new AutoFocusCallbackImpl()) ;
      }
    } 

  } 

  private class MySurfaceViewCallback implements SurfaceHolder.Callback { 

    //当预览界面格式大小改变时,调用
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) { 

    } 

    //初次实例化界面调用
    public void surfaceCreated(SurfaceHolder holder) {
      MyCameraDemo.this.cam = Camera.open(0) ;  // 取得第一个摄像头
      //窗口服务
      WindowManager manager = (WindowManager) MyCameraDemo.this
          .getSystemService(Context.WINDOW_SERVICE);
      //取得display显示对象
      Display display = manager.getDefaultDisplay() ;
      //照相机参数
      Parameters param = MyCameraDemo.this.cam.getParameters() ;
      //将照相机预览大小设置为display大小
      param.setPreviewSize(display.getWidth(), display.getHeight()) ;
      param.setPreviewFrameRate(5) ; // 一秒5帧
      param.setPictureFormat(PixelFormat.JPEG) ; // 图片形式
      param.set("jpen-quality", 80) ;//图片质量,最高100
      MyCameraDemo.this.cam.setParameters(param) ;
      try {
        MyCameraDemo.this.cam.setPreviewDisplay(MyCameraDemo.this.holder) ;
      } catch (IOException e) {
      }
      MyCameraDemo.this.cam.startPreview() ; // 进行预览
      MyCameraDemo.this.previewRunning = true ;  // 已经开始预览
    } 

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
      if(MyCameraDemo.this.cam != null) {
        if(MyCameraDemo.this.previewRunning) {
          MyCameraDemo.this.cam.stopPreview() ;  // 停止预览
          MyCameraDemo.this.previewRunning = false ;
        }
        MyCameraDemo.this.cam.release() ;
      }
    } 

  } 

  private class AutoFocusCallbackImpl implements AutoFocusCallback { 

    @Override
    public void onAutoFocus(boolean success, Camera camera) {
      if(success) {  // 成功
        MyCameraDemo.this.cam.takePicture(sc, pc, jpgcall) ;
      }
    } 

  } 

  private PictureCallback jpgcall = new PictureCallback() { 

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {  // 保存图片的操作
      Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
      String fileName = Environment.getExternalStorageDirectory()
          .toString()
          + File.separator
          + "mldnphoto"
          + File.separator
          + "MLDN_" + System.currentTimeMillis() + ".jpg";
      File file = new File(fileName) ;
      if (!file.getParentFile().exists()) {
        file.getParentFile().mkdirs() ; // 创建文件夹
      }
      try {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) ;
        bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos) ; // 向缓冲区之中压缩图片
        bos.flush() ;
        bos.close() ;
        Toast.makeText(MyCameraDemo.this,
            "拍照成功,照片已保存在" + fileName + "文件之中!", Toast.LENGTH_SHORT)
            .show();
      } catch (Exception e) {
        Toast.makeText(MyCameraDemo.this,
            "拍照失败!", Toast.LENGTH_SHORT)
            .show();
      }
      MyCameraDemo.this.cam.stopPreview() ;
      MyCameraDemo.this.cam.startPreview() ;
    } 

  } ; 

  private ShutterCallback sc = new ShutterCallback(){
    @Override
    public void onShutter() {
      // 按下快门之后进行的操作
    }
  } ;
  private PictureCallback pc = new PictureCallback() { 

    @Override
    public void onPictureTaken(byte[] data, Camera camera) { 

    } 

  } ;
}

 主布局函数

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <Button
    android:id="@+id/but"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="照相" />
  <SurfaceView
    android:id="@+id/surface"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
</LinearLayout>

以上就是Android 相机的使用方法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android 调用系统相机拍摄获取照片的两种方法实现实例

    Android 调用系统相机拍摄获取照片的两种方法实现实例 在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的照片.下面是我总结的两种方法获取拍摄之后的照片,一种是通过Bundle来获取压缩过的照片,一种是通过SD卡获取的原图. 下面是演示代码: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:

  • Android调用相机并将照片存储到sd卡上实现方法

    Android中实现拍照有两种方法,一种是调用系统自带的相机,然后使用其返回的照片数据. 还有一种是自己用Camera类和其他相关类实现相机功能,这种方法定制度比较高,洗染也比较复杂,一般平常的应用只需使用第一种即可. 用Intent启动相机的代码: 复制代码 代码如下: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1);拍完照后就可以在onActivity

  • Android 7.0调用相机崩溃详解及解决办法

    Android 7.0调用相机崩溃解决办法 错误提示: android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/IMG_1041503431.jpg exposed beyond app through ClipData.Item.getUri() 处理方式 /** * Open camera */ private void showCameraAction() { if (ContextCompat.checkSe

  • Android自定义照相机详解

    几乎每个APP都会用的相机功能,下面小编把内容整理分享到我们平台,供大家参考,感兴趣的朋友一起学习吧! 启动相机的两种方式 1.直接启动系统相机 <code class="hljs avrasm"> Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);</code> 或者指定返回图片的名称mCurrentPho

  • Android启动相机拍照并返回图片

    具体实现过程请看下面代码: 简单的调用了一下系统的拍照功能 代码如下所示: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下sdcard是否可用 */ String state = Environment.getExternalStorageState(); //拿到sdcard是否可用的状态码 if (state.equals(Environment.MEDIA_MOUNTED)){ //如果可用 Intent intent

  • Android实现读取相机(相册)图片并进行剪裁

    我们先说一下思路,在android系统中就自带了图片剪切的应用,所以,我们只需要将我们获取到的相片传给图片剪切应用,再将剪切好的相片返回到我们自己的界面显示就ok了 在开发一些APP的过程中,我们可能涉及到头像的处理,比如从手机或者相册获取头像,剪裁成自己需要的头像,设置或上传头像等.网上一些相关的资料也是多不胜数,但在实际应用中往往会存在各种问题,没有一个完美的解决方案.由于近期项目的需求,就研究了一下,目前看来还没有什么问题. 这里我们只讨论获取.剪裁与设置,上传流程根据自己的业务需求添加.

  • Android 简单的照相机程序的实例代码

    复制代码 代码如下: class surface extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder sfholder; Camera camera; Bitmap bitmap; public surface(Context context) {             super(context);             // TODO Auto-generated constructor stub s

  • Android 照相机的实例应用

    Android 照相机的实例应用 关键技术: SurfaceHolder.Callback public class MyCameraDemo extends Activity { private SurfaceView surface = null ; private Button but = null ; private SurfaceHolder holder = null ; private Camera cam = null ; private boolean previewRunni

  • Android xml解析实例详解

    Android  xml解析实例详解 实现效果图: XmlActivity package com.Android.xiong.gridlayoutTest; import android.app.Activity; import android.content.res.XmlResourceParser; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; impo

  • Android 调用WCF实例详解

    Android 调用WCF实例 1. 构建服务端程序 using System.ServiceModel; namespace yournamespace { [ServiceContract(Name = "HelloService", Namespace = "http://www.master.haku")] public interface IHello { [OperationContract] string SayHello(); } } namespa

  • Android 自定义状态栏实例代码

    一.目标:Android5.0以上 二.步骤 1.在res-values-colors.xml下新建一个RGB颜色 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#3

  • Android getevent用法实例详解

     Android getevent用法实例详解 最近在测试设备按键的常用命令,感觉这些命令都有的,但就是不知道怎么查找. 翻阅了几篇博文,才发现有一个getevent,就是指这样的命令. 首先需要说明的是getevent命令后面可以带上具体的input设备,列如getevent /dev/iput/event0,这样可以过滤掉一些不用显示的input的设备. 我在之前的使用中,还是有些找不到点子,也是一步一步使用起来的. 首先看-p 选项, -p选项用于输出input设备相关的一些信息,列如,

  • Android 日期选择器实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //出生年月设置 private void birthSetting() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR, 1); new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() { @Override public void onDat

  • Android 滑动拦截实例代码解析

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package demo.hq.com.fby; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.LinearLayout; /** * Created by huqing on 2016/12/7.

  • Android Kotlin开发实例(Hello World!)及语法详解

    Android Kotlin开发实例及语法详解 前言 Kotlin是一种在 Java虚拟机上执行的静态型别编程语言,它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言.该语言有几个优势 1. 简洁 它大大减少你需要写的样板代码的数量. 2. 安全 避免空指针异常等整个类的错误. 3. 通用 构建服务器端程序.Android 应用程序或者在浏览器中运行的前端程序. 4. 互操作性 通过 100% Java 互操作性,利用 JVM 既有框架和库. 配置 在我们的AndroidS

  • Android ProgressDialog的实例详解

    Android ProgressDialog的实例详解 当自己做一些耗时操作时,希望给用户一些提示信息,告诉用户正在进行耗时操作,这时就可以用到ProgressDialog. 1.新建一个全局变量ProgressDialog private ProgressDialog mDialog; 2.设置ProgressDialog的相关参数: progressDialog = new ProgressDialog( ProgressDialogActivity.this); //设置进度条风格,风格为

  • Android Dialog 动画实例详解

    Android Dialog 动画实例详解 动画描述: 动画与底部菜单一样出现和消失 制作过程: 1. 创建两个动画文件 window_in.xml: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration=&

随机推荐