Android实现调用摄像头拍照并存储照片

 更新时间:2022年01月11日 10:45:56   作者:吃橘子的季节呢  
本文主要介绍了如何利用Android调用摄像头拍照,并显示拍照后的图片到ImageView中,文中的示例代码讲解详细,感兴趣的可以动手试一试

1、前期准备

需要在Manifest中添加相关权限

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2、主要方法

1、需要使用Intent调用摄像头

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用Camera
startActivityForResult(intent, Activity.RESULT_OK);//如果正常,则返回    Activity.RESULT_OK    本质为 int类型的1

2、需要检查SD卡(外部存储)状态

Environment.MEDIA_MOUNTED sd卡在手机上正常使用状态

Environment.MEDIA_UNMOUNTED 用户手工到手机设置中卸载sd卡之后的状态

Environment.MEDIA_REMOVED 用户手动卸载,然后将sd卡从手机取出之后的状态

Environment.MEDIA_BAD_REMOVAL 用户未到手机设置中手动卸载sd卡,直接拨出之后的状态

Environment.MEDIA_SHARED 手机直接连接到电脑作为u盘使用之后的状态

Environment.MEDIA_CHECKINGS 手机正在扫描sd卡过程中的状态

在代码中的判断

String sdStatus = Environment.getExternalStorageState();
if(!sdStatus.equals(Environment.MEDIA_MOUNTED)){
                System.out.println(" ------------- sd card is not avaiable ---------------");
                return;
}

3、获取图片及其压缩图片

String name = "photo.jpg";//定义图片名称

Bundle bundle = data.getExtras();//data为onActivityResult中的intent类型的参数
Bitmap bitmap = (Bitmap) bundle.get("data");//bitmap

//            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/");
//            file.mkdirs(); //创建文件夹

//            String fileName = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+name;
String fileName = "sdcard"+"/"+name;//初始化文件路径

FileOutputStream fos =null;//初始化文件输出流

try {
    // System.out.println(fileName);	// 测试用,查看文件路径
    fos=new FileOutputStream(fileName);	// 输出文件到外部存储
    //今天第一次正视这个bitmap.compress()方法,它用来压缩图片大小。
    /*
    	这个方法有三个参数:
    	Bitmap.CompressFormat format 图像的压缩格式;
		int quality 图像压缩率,0-100。 0 压缩100%,100意味着不压缩;
		OutputStream stream 写入压缩数据的输出流;
		public boolean compress(CompressFormat format, int quality, OutputStream stream) {}
		返回值boolean类型
		如果成功地把压缩数据写入输出流,则返回true。
    */
    bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);	
    
} catch (FileNotFoundException e) {
    e.printStackTrace();
}finally {
    try {
        fos.flush();	//释放输出流
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

3、案例展示

1、Layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_take_photo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="take photo"
        android:id="@+id/takephoto"
        />
    <ImageView
        android:layout_below="@+id/takephoto"
        android:layout_width="400dp"
        android:layout_height="400dp"
        android:id="@+id/picture"
        />
</RelativeLayout>

2、MainActivity

package icu.whatsblog.CameraCrop;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Environment;
import android.provider.MediaStore;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import androidx.appcompat.app.AppCompatActivity;

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

import lee.suk.cameracrop.R;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((Button) findViewById(R.id.takephoto)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                startActivityForResult(intent, 1);
            }
        });
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == Activity.RESULT_OK){
            String sdStatus = Environment.getExternalStorageState();

            if(!sdStatus.equals(Environment.MEDIA_MOUNTED)){
                System.out.println(" ------------- sd card is not avaiable ---------------");
                return;
            }


            String name = "photo.jpg";

            Bundle bundle = data.getExtras();
            Bitmap bitmap = (Bitmap) bundle.get("data");

//            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/");
//            file.mkdirs(); //创建文件夹

//            String fileName = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+name;
            String fileName = "sdcard"+"/"+name;

            FileOutputStream fos =null;

            try {
                System.out.println(fileName);
                fos=new FileOutputStream(fileName);
                bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            ((ImageView) findViewById(R.id.picture)).setImageBitmap(bitmap);
        }
    }
}

到此这篇关于Android实现调用摄像头拍照并存储照片的文章就介绍到这了,更多相关Android调用摄像头拍照并存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android 动态添加Fragment的实例代码

    Android 动态添加Fragment的实例代码

    这篇文章主要介绍了Android 动态添加Fragment的实例代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • Android  Handler 机制实现原理分析

    Android Handler 机制实现原理分析

    本文主要介绍 Android Handle机制实现的原理,这里整理了详细的关于Handler的资料以及工作流程和实际应用,有兴趣的小伙伴可以参考下
    2016-08-08
  • java & Android 格式化字符串详解

    java & Android 格式化字符串详解

    这篇文章主要介绍了java & Android 格式化字符串详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • Android开发入门环境快速搭建实战教程

    Android开发入门环境快速搭建实战教程

    最近想重新学习下Android,学习之前开发环境的搭建是个首先要解决的问题,所以下面这篇文章主要给大家介绍了Android开发环境搭建的相关资料,文中将实现的步骤一步步介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Android 系统实现多种开机动画和logo切换功能

    Android 系统实现多种开机动画和logo切换功能

    这篇文章主要介绍了android 系统实现多种开机动画和logo切换功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • Android接入USB扫码模块的方法

    Android接入USB扫码模块的方法

    这篇文章主要为大家详细介绍了Android接入USB扫码模块的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Android 6.0动态权限申请教程

    Android 6.0动态权限申请教程

    本文主要介绍了Android 6.0动态权限申请的教程,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Android实现IP地址输入框的方法示例代码

    Android实现IP地址输入框的方法示例代码

    输入框是我们日常开发中经常遇到的一个控件,如果更好的控制输入框是对用户体验很重要的一步,所以下面这篇文章主要给大家介绍了关于Android如何实现IP输入框的相关资料,需要的朋友可以参考下。
    2017-10-10
  • Android实现后台服务拍照功能

    Android实现后台服务拍照功能

    这篇文章主要为大家详细介绍了Android实现后台服务拍照功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android自定义个性化的Dialog示例

    Android自定义个性化的Dialog示例

    这篇文章主要介绍了Android自定义个性化的Dialog,结合实例形式分析了自定义Dialog的功能、样式、布局等相关操作技巧,需要的朋友可以参考下
    2017-02-02

最新评论