美文网首页
使用Android系统相机捕获图片(一)

使用Android系统相机捕获图片(一)

作者: R_flash | 来源:发表于2018-11-07 10:32 被阅读0次

    写文章的目的

    1. 静下心来学习
    2. 知识点的积累
    3. 总结,做笔记

    导读

    个人认为系统相机捕获图片是一个复合功能点,包括调用相机、拍照、返回图片,还要考虑实际的应用场景:如手机版本等,因此会分为几篇文章去讲解,由简入繁。每一篇主体是示例代码,通过代码去理解这个功能。

    需求

    • 调用系统相机
    • 返回图片
    • 显示图片

    代码解构

    1.调用系统相机:使用Intent方式,action使用的是MediaStore.ACTION_IMAGE_CAPTURE。看到这么长的参数可能会很慌,其实不用着急。MediaStore是一个Media provider,包含内部存储和外部存储的媒体元数据。ACTION_IMAGE_CAPTURE里面单词也很简单:图片捕获。那么整个其实也就能理解了:相机就是用来拍照的,拍照也就是捕获图片,拍完后需要存储。废话少说,直接上代码。

    //创建intent ,设置action
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    //调用相机
    startActivityForResult(intent, IMAGE_RESULT);
    

    2.返回图片并显示:既然使用startActivityForResult,当然要用onActivityResult去接收。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(resultCode != RESULT_OK ){
                  return;
            }
            if(requestCode == IMAGE_RESULT){
                  //通过data获取bundle数据
                  Bundle extras = data.getExtras();
                  //拍照后系统会返回一个bitmap,key是data。(没有找到常量去代替data)
                  Bitmap bitmap = (Bitmap) extras.get("data");
                  //显示图片
                  imageView.setImageBitmap(bitmap);
            }
    }
    

    3.显示结果:会发现只显示了一点点???并不是我的ImageView只用这么大,而是返回的图片只用这么一点。可以在获取打印bitmap 的宽高验证一下。


    Screenshot_20181107-101719.jpg

    总结

    那么,使用系统相机捕获图片最简单的样例就讲完了。可能会有疑问:这么一点图片有什么用?图片太小看的我眼睛疼,我需要大图又该怎么实现?请听下回分解。

    代码样例

    1.xml代码

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="capture_image"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <ImageView
            android:id="@+id/iv"
            android:layout_marginTop="30dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/btn" />
    
    
    </android.support.constraint.ConstraintLayout>
    

    2.java代码

    package com.rflash.captrueimage01;
    
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.provider.MediaStore;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private Button button;
        private ImageView imageView;
    
        private final int IMAGE_RESULT = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = findViewById(R.id.btn);
            imageView = findViewById(R.id.iv);
            button.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id) {
                case R.id.btn:
                    //打开相机
                    openCameraForResult();
                    break;
            }
        }
    
        /**
         * 打开相机
         */
        private void openCameraForResult() {
            //创建intent ,设置action
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            //调用相机
            startActivityForResult(intent, IMAGE_RESULT);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode != RESULT_OK) {
                return;
            }
            if (requestCode == IMAGE_RESULT) {
                //通过data获取bundle数据
                Bundle extras = data.getExtras();
                //拍照后系统会返回一个bitmap,key是data。(没有找到常量去代替data)
                Bitmap bitmap = (Bitmap) extras.get("data");
                //打印bitmap宽高
                Log.d("--width", bitmap.getWidth() + "");
                Log.d("--height", bitmap.getHeight() + "");
                //显示图片
                imageView.setImageBitmap(bitmap);
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:使用Android系统相机捕获图片(一)

          本文链接:https://www.haomeiwen.com/subject/bcsqhftx.html