Android Camera 拍照

本节给大家讲解了如何去调用系统自带相机获取拍照后的图片,以及自己写 Carema 来 完成自定义相机

Android 中的 Camera 有两种使用方法

  1. 调用系统自带相机拍照,然后获取拍照后的图片

  2. 自定义拍照界面

权限

调用系统相机和保存照片需要用到两个权限

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

调用系统自带 Carema

只需要简单的几行代码,就可以调用 Android 自带的系统相机

Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(it,Activity.DEFAULT_KEYS_DIALER);

相机拍照后会返回一个 intentonActivityResult() 方法

intent 的 extra 参数则包含一个编码过的 Bitmap

//重写 onActivityResult() 方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == Activity.RESULT_OK){
            Bundle bundle = data.getExtras();
            Bitmap bitmap = (Bitmap) bundle.get("data");
            ms_img_show.setImageBitmap(bitmap);
    }
}

保存照片

拍完的图片是不会保存到本地的

需要我们自己手动写代码把图片保存到我们的 SD 卡里

//定义一个保存图片的 File 变量
private File currentImageFile = null;

//在按钮点击事件处写上这些东西,这些是在SD卡创建图片文件的:
@Override
public void onClick(View v) {

    // 创建文件夹,如果不存在则忽略
    File dir = new File(Environment.getExternalStorageDirectory(),"pictures");
    if(dir.exists()){
        dir.mkdirs();
    }

    // 创建图片文件,如果不存在则新建
    currentImageFile = new File(dir,System.currentTimeMillis() + ".jpg");
    if(!currentImageFile.exists()){
        try {
            currentImageFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    Uri imageUri = null;
    if (Build.VERSION.SDK_INT>=24)
    {
        imageUri = FileProvider.getUriForFile(MainActivity.this,getPackageName() + ".fileprovider",currentImageFile);
    }
    else
    {
        imageUri = Uri.fromFile(currentImageFile);
    }


    // 调用系统相机
    Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    it.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == Activity.DEFAULT_KEYS_DIALER) {
        ms_img_show.setImageURI(Uri.fromFile(currentImageFile));
    }
}

范例


  1. 创建一个 空的 Android 项目 cn.twle.android.Camera

  2. 修改 activity_main.xml 采用线性布局,添加一个 VideoView 和三个 Button

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="5dp">
    
        <Button
                android:id="@+id/btn_camera"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="拍照" />
    
        <ImageView
            android:id="@+id/ms_img_show"
            android:scaleType="centerInside" 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
  3. 修改 AndroidManifest.xml 添加调用系统相机和 SD 卡权限

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  4. 修改 AndroidManifest.xml 添加 provider

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>
    
  5. 然后在 res 目录下创建资源目录 xml 并添加文件 res/xml/provider_paths.xml

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <root-path name="name" path="" />
        <external-path name="external_files" path="pictures"/>
    </paths>
    
  6. 修改 MainActivity.java

    package cn.twle.android.camera;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.support.v4.content.FileProvider;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    
    import java.io.File;
    import java.io.IOException;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private ImageView ms_img_show;
        private Button btn_camera;
    
        //定义一个保存图片的 File 变量
        private File currentImageFile = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ms_img_show = (ImageView) findViewById(R.id.ms_img_show);
            btn_camera  = (Button) findViewById(R.id.btn_camera);
    
            btn_camera.setOnClickListener(this);
        }
    
        //在按钮点击事件处写上这些东西,这些是在SD卡创建图片文件的:
        @Override
        public void onClick(View v) {
            File dir = getExternalFilesDir("pictures");
            if(dir.exists()){
                dir.mkdirs();
            }
            currentImageFile = new File(dir,System.currentTimeMillis() + ".jpg");
            if(!currentImageFile.exists()){
                try {
                    currentImageFile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            Uri imageUri = null;
            if (Build.VERSION.SDK_INT>=24)
            {
                imageUri = FileProvider.getUriForFile(MainActivity.this,getPackageName() + ".fileprovider",currentImageFile);
            }
            else
            {
                imageUri = Uri.fromFile(currentImageFile);
            }
    
            // 调用系统相机
            Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            it.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == Activity.DEFAULT_KEYS_DIALER) {
            ms_img_show.setImageURI(Uri.fromFile(currentImageFile));
            }
        }
    }
    

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.