(原创)android中使用相机的两种方式

本文介绍了在Android应用中调用手机摄像头的两种方法:通过发送Intent启动系统自带摄像应用和直接使用Camera对象进行拍摄。前者简单易用但灵活性低,后者虽复杂但可自定义拍摄界面和功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在社交类应用或扫描二维码的场合都需要用到手机上的摄像头

在程序中启用这一硬件主要有两类方法

1.发送intent启动系统自带的摄像应用

此应用的AndroidManifest中的intent-filter如下

<intent-filter>
                <action android:name="android.media.action.VIDEO_CAPTURE" />
                <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

发送intent的代码如下:

     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");        
        String path ="storage/sdcard1/picture1.jpg";
        File pic =new File(path);
        Uri uri=      Uri.fromFile(pic);
        //设定拍照后照片保存位置
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri );    
        startActivity(intent);

2.自己调用API,试用Camera对象来完成拍摄保存

代码如下:

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        surfaceView = (SurfaceView) findViewById(R.id.sv);
        // 获得预览画面的接收类
        SurfaceHolder holder = surfaceView.getHolder();
        // 接收类设置callback -->surface创建的时候开启camera开始预览,退出时关闭
        // 设置数据来源自渲染引擎, 不使用自己的缓冲区.
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        camera = Camera.open();

        holder.addCallback(new Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
                camera.stopPreview(); // 停止摄像头预览
                camera.release();
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                // TODO Auto-generated method stub
                // 摄像头的使用
                try {
                    camera.setPreviewDisplay(holder);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }// 设置预览显示
                camera.startPreview();// 开始预览

            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format,
                    int width, int height) {
                // TODO Auto-generated method stub

            }
        });
    }

    public void click(View v) {
        shoot();
    }

    public void shoot() {

        camera.takePicture(null, null, new PictureCallback() {

            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                // TODO Auto-generated method stub
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
                        data.length);

                FileOutputStream fos = null;
                try {
                    fos = new FileOutputStream("sdcard/pic1.jpg");
                    boolean isSuccess = bitmap.compress(CompressFormat.JPEG,
                            50, fos);
                    if (isSuccess) {
                        Toast.makeText(MainActivity.this, "拍摄和存储成功", 0).show();
                    } else {
                        Toast.makeText(MainActivity.this, "拍摄和存储失败", 0).show();
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (fos != null) {
                        try {
                            fos.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MEDIA_MOUNTED);

        intent.setData(Uri.fromFile(new File("/sdcard")));
        sendBroadcast(intent);

        camera.startPreview();

    }

两种方法的对比

前一种方法需要跳出本程序,而且灵活性较低,但是简单易用,代码较少便于使用和维护.

后一种方法虽然比较复杂,但是可以自己定制拍摄activity的样式以及功能选项,并且在本应用中就可以完成拍摄的功能,用处也很多.

转载于:https://www.cnblogs.com/BlogCommunicator/p/4906009.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值