Andorid Camera的简单实用

本文介绍在应用中如何使用系统相机与自定义相机功能,包括权限申请、配置及实现方式,通过示例代码展示如何操作。

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

现在很多应用中都会使用到我们的相机功能,来进行拍照,设置头像等等。
在这里给大家简单介绍一下Camera的使用。
大家尝尝会看到当我们在app中调用拍照功能时,往往会出现选择相机,而在这块就出现了我们所谓的 自定义Camera和系统自带的Camera。
下面就给大家介绍一下这两种:
备注:项目中使用了ButterKnife快速开发框架

应用权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.howie.camerademo">
    <!-- 访问SDCard -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 自定义相机使用权限 -->
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">

            <!-- 自定义相机 配置intent-filter -->
            <intent-filter>
                <action android:name="android.media.action.IMAGE_CAPTURE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".CustActivity" />
        <activity android:name=".ResultActivity"></activity>
    </application>

</manifest>

1.系统Camera

package com.howie.camerademo;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import butterknife.ButterKnife;
import butterknife.InjectView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    @InjectView(R.id.btn_camera)Button btnCamera;
    @InjectView(R.id.btn_save)Button btnSave;
    @InjectView(R.id.iv_photo)ImageView ivPhoto;
    @InjectView(R.id.btn_cust)Button btnCust;
    private String path;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        path = Environment.getExternalStorageDirectory().getPath();
        path = path + "/temp.png";
        ButterKnife.inject(this);
        btnCamera.setOnClickListener(this);
        btnSave.setOnClickListener(this);
        btnCust.setOnClickListener(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){
            if(requestCode == 0x001){
                Bundle bundle = data.getExtras();
                if(bundle != null){
                    Bitmap bitmap = (Bitmap)bundle.get("data");
                    Toast.makeText(this,bitmap.getByteCount()+"",Toast.LENGTH_SHORT).show();
                    ivPhoto.setImageBitmap(bitmap);
                }
            }else if(requestCode == 0x011){
                FileInputStream fis = null;
                    try {
                        fis = new FileInputStream(path);
                        Bitmap bitmap = BitmapFactory.decodeStream(fis);
                        Toast.makeText(this,bitmap.getByteCount()+"",Toast.LENGTH_SHORT).show();
                        ivPhoto.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                }finally {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }
    }

    @Override
    public void onClick(View v) {
        Intent intent = null;
        switch (v.getId()){
            /* 通过intent将拍照后的图片传递回来(图片经过了压缩) */
            case R.id.btn_camera:
                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent,0x001);
                break;
            case R.id.btn_save:
                /* 将拍照后的图片保存到本地 */
                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                Uri uri = Uri.fromFile(new File(path));
                intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
                startActivityForResult(intent,0x011);
                break;
            case R.id.btn_cust:
                /* 自定义相机拍照 */
                startActivity(new Intent(this,CustActivity.class));
                break;
        }
    }
}

*备注:建议使用真机测试
在此使用了Surfaceview进行显示*
2.自定义相机

package com.howie.camerademo;

import android.content.Intent;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import butterknife.ButterKnife;
import butterknife.InjectView;

public class CustActivity extends AppCompatActivity implements View.OnClickListener,SurfaceHolder.Callback{
    @InjectView(R.id.btn_cust_camera)Button btnCustCamera;
    @InjectView(R.id.sv_1)SurfaceView sv;
    private SurfaceHolder mHolder;
    private Camera camera;
    private Camera.PictureCallback pictureCallback = new Camera.PictureCallback(){
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            File file = new File("/sdcard/temp.jpg");
            try {
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(data);
                fos.close();
                Intent intent = new Intent(CustActivity.this,ResultActivity.class);
                intent.putExtra("path",file.getAbsolutePath());
                startActivity(intent);
                CustActivity.this.finish();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cust);
        ButterKnife.inject(this);
        mHolder = sv.getHolder();
        mHolder.addCallback(this);
        btnCustCamera.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.btn_cust_camera:
                Camera.Parameters parameter = camera.getParameters();
                //PPICTURE TYPE
                parameter.setPictureFormat(ImageFormat.JPEG);
                //DISPLAY SIZE
                parameter.setPreviewSize(800, 400);
                //AUTO FOCUS
                parameter.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
                if(camera != null){
                    camera.autoFocus(new Camera.AutoFocusCallback() {
                        @Override
                        public void onAutoFocus(boolean success, Camera camera) {
                            Toast.makeText(CustActivity.this,success+"",Toast.LENGTH_SHORT).show();
                            if(success){
                                camera.takePicture(null, null, pictureCallback);
                            }
                        }
                    });
                }
                break;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(camera == null){
            camera = getCamera();
            setStartPreview();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(camera != null){
            camera.setPreviewCallback(null);
            camera.stopPreview();
            releaseCamera();
        }
    }

    /**
     * 获取Camera
     * @return
     */
    private Camera getCamera(){
        try {
            camera = android.hardware.Camera.open();
        } catch (Exception e) {
            camera = null;
            e.printStackTrace();
        }
        return camera;
    }
    private void setStartPreview(){
        if(camera != null && mHolder != null){
            try {
                camera.setPreviewDisplay(mHolder);
                //DeFault:H   SET:V
                camera.setDisplayOrientation(90);
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    private void releaseCamera(){
        if(camera !=null){
            camera.release();
            camera = null;
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        setStartPreview();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        camera.stopPreview();
        setStartPreview();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
    }
}
package com.howie.camerademo;

import android.content.Intent;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageButton;
import android.widget.ImageView;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import butterknife.ButterKnife;
import butterknife.InjectView;

public class ResultActivity extends AppCompatActivity {
    @InjectView(R.id.iv_cur)ImageView ivCur;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        ButterKnife.inject(this);
        Intent intent = getIntent();
        String path = intent.getStringExtra("path");
        ivCur.setImageBitmap(BitmapFactory.decodeFile(path));
    }
}

xml:
activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.howie.camerademo.MainActivity">
    <Button
        android:id="@+id/btn_camera"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="打开系统Camera"/>
    <Button
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="拍照保存原图"/>
    <Button
        android:id="@+id/btn_cust"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义Camera"/>
    <ImageView
        android:id="@+id/iv_photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

activity_cust:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.howie.camerademo.CustActivity">
    <Button
        android:id="@+id/btn_cust_camera"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="拍照---自定义"/>
    <SurfaceView
        android:id="@+id/sv_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

activity_result:

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.howie.camerademo.ResultActivity">
    <ImageView
        android:id="@+id/iv_cur"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

如需要源码请留言…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值