写文章的目的
- 静下心来学习
- 知识点的积累
- 总结,做笔记
导读
个人认为系统相机捕获图片是一个复合功能点,包括调用相机、拍照、返回图片,还要考虑实际的应用场景:如手机版本等,因此会分为几篇文章去讲解,由简入繁。每一篇主体是示例代码,通过代码去理解这个功能。
需求
- 调用系统相机
- 返回图片
- 显示图片
代码解构
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 的宽高验证一下。
总结
那么,使用系统相机捕获图片最简单的样例就讲完了。可能会有疑问:这么一点图片有什么用?图片太小看的我眼睛疼,我需要大图又该怎么实现?请听下回分解。
代码样例
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);
}
}
}