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

写文章的目的

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

导读

承接上篇文章使用Android系统相机捕获图片(一),如果调用系统相机,如何去获取大图片?

需求

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

代码解构

  1. 为了获取更大的图片,可以将一个附加值传递给触发系统相机的intent,这个附加值extrakeyMediaStore类中指定,是常量EXTRA_OUTPUT:这个附加值extravalue将以Uri的方式指示系统相机你想要将捕获的图像保存在什么位置。

将图片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"。这里我是将图片放在了外部储存卡/rflash/my.jpg中,提个问题:能将图片放在内部储存中吗?比如getFilesDir()+"/rflash"+"/my.jpg",这个有兴趣的可以去做测试。

  • 创建图片存储路径(path),因为设计到文件存储,需要添加读写权限。
    
    /**
     * 图片存储路径
     */
    private String mImageFilePath;

 /**
     * 构建图片路径
     * 将图片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"
     */
    private void createImageFilePath() {
        mImageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "rflash" + File.separator + "my.jpg";
    }
  • 通过路径生成图片Uri
 /**
     * 获取图片uri
     *
     * @return
     */
    private Uri getImageUri() {
        File file = new File(mImageFilePath);
        Uri imageUri = Uri.fromFile(file);
        return imageUri;
    }
  • 打开相机
   /**
     * 打开相机
     */
    private void openCameraForResult() {
        //创建intent ,设置action
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //构建图片路径
        createImageFilePath();
        //将捕获的图片保存在imageUri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
        //调用相机
        startActivityForResult(intent, IMAGE_RESULT);
    }
  1. 返回图片并显示:既然使用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) {
            //这里不能通过Intent对象去获取"data",
            // 因为在打开相机时已经通过MediaStore.EXTRA_OUTPUT告诉相机:你把图片放在我传给你的Uri中
            //所以可以直接通过BitmapFactory在存储路径中获取图片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
            imageView.setImageBitmap(bitmap);
        }
    }
  1. 显示结果:项目是在同事的手机上运行的(没法截图,通过我手机拍照然后上传到),魅族手机,系统版本5.1。图中可以看的,我们获取了大图并显示。


    1541572796220.jpg

总结

那么 使用Android系统相机捕获图片就只是这样了吗?我在上一篇就说过,这个功能在我看来是个复合功能。同样地,抛出问题,下回分解。

  • 如果将项目运行在高版本手机上可以实现需求吗?如何解决 ?

代码样例

1.xml代码




    

2.java代码

package com.rflash.captrueimage02;

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

import java.io.File;

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 String mImageFilePath;

  /**
     * 构建图片路径
     * 将图片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"
     */
    private void createImageFilePath() {
        mImageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "rflash" + File.separator + "my.jpg";
    }

    /**
     * 获取图片uri
     *
     * @return
     */
    private Uri getImageUri() {
        File file = new File(mImageFilePath);
        Uri imageUri = Uri.fromFile(file);
        return imageUri;
    }

    /**
     * 打开相机
     */
    private void openCameraForResult() {
        //创建intent ,设置action
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //构建图片路径
        createImageFilePath();
        //将捕获的图片保存在imageUri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
        //调用相机
        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) {
            //这里不能通过Intent对象去获取"data",
            // 因为在打开相机时已经通过MediaStore.EXTRA_OUTPUT告诉相机:你把图片放在我传给你的Uri中
            //所以可以直接通过BitmapFactory在存储路径中获取图片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
            imageView.setImageBitmap(bitmap);
        }
    }
}

3.AndroidManifest.xml中需要添加权限

    

你可能感兴趣的:(使用Android系统相机捕获图片(二))