寫(xiě)文章的目的
- 靜下心來(lái)學(xué)習(xí)
- 知識(shí)點(diǎn)的積累
- 總結(jié)透罢,做筆記
導(dǎo)讀
承接上篇文章使用Android系統(tǒng)相機(jī)捕獲圖片(一)堵幽,如果調(diào)用系統(tǒng)相機(jī)垫释,如何去獲取大圖片拓挥?
需求
- 調(diào)用系統(tǒng)相機(jī)
- 返回大圖片
- 顯示圖片
代碼解構(gòu)
- 為了獲取更大的圖片菇爪,可以將一個(gè)附加值傳遞給觸發(fā)系統(tǒng)相機(jī)的
intent
算芯,這個(gè)附加值extra
的key
在MediaStore
類中指定,是常量EXTRA_OUTPUT
:這個(gè)附加值extra
的value
將以Uri
的方式指示系統(tǒng)相機(jī)你想要將捕獲的圖像保存在什么位置凳宙。
將圖片保存在
Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"
熙揍。這里我是將圖片放在了外部?jī)?chǔ)存卡/rflash/my.jpg
中,提個(gè)問(wèn)題:能將圖片放在內(nèi)部?jī)?chǔ)存
中嗎氏涩?比如getFilesDir()+"/rflash"+"/my.jpg"
届囚,這個(gè)有興趣的可以去做測(cè)試有梆。
- 創(chuàng)建圖片存儲(chǔ)路徑(path),因?yàn)樵O(shè)計(jì)到文件存儲(chǔ)意系,需要添加讀寫(xiě)權(quán)限泥耀。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
/**
* 圖片存儲(chǔ)路徑
*/
private String mImageFilePath;
/**
* 構(gòu)建圖片路徑
* 將圖片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"
*/
private void createImageFilePath() {
mImageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "rflash" + File.separator + "my.jpg";
}
- 通過(guò)路徑生成圖片Uri
/**
* 獲取圖片uri
*
* @return
*/
private Uri getImageUri() {
File file = new File(mImageFilePath);
Uri imageUri = Uri.fromFile(file);
return imageUri;
}
- 打開(kāi)相機(jī)
/**
* 打開(kāi)相機(jī)
*/
private void openCameraForResult() {
//創(chuàng)建intent ,設(shè)置action
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//構(gòu)建圖片路徑
createImageFilePath();
//將捕獲的圖片保存在imageUri
intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
//調(diào)用相機(jī)
startActivityForResult(intent, IMAGE_RESULT);
}
- 返回圖片并顯示:既然使用startActivityForResult蛔添,當(dāng)然要用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) {
//這里不能通過(guò)Intent對(duì)象去獲取"data",
// 因?yàn)樵诖蜷_(kāi)相機(jī)時(shí)已經(jīng)通過(guò)MediaStore.EXTRA_OUTPUT告訴相機(jī):你把圖片放在我傳給你的Uri中
//所以可以直接通過(guò)BitmapFactory在存儲(chǔ)路徑中獲取圖片
Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
imageView.setImageBitmap(bitmap);
}
}
-
顯示結(jié)果:項(xiàng)目是在同事的手機(jī)上運(yùn)行的(沒(méi)法截圖迎瞧,通過(guò)我手機(jī)拍照然后上傳到簡(jiǎn)書(shū))夸溶,魅族手機(jī),系統(tǒng)版本5.1凶硅。圖中可以看的缝裁,我們獲取了大圖并顯示。
1541572796220.jpg
總結(jié)
那么 使用Android系統(tǒng)相機(jī)捕獲圖片
就只是這樣了嗎咏尝?我在上一篇就說(shuō)過(guò)压语,這個(gè)功能在我看來(lái)是個(gè)復(fù)合功能。同樣地编检,拋出問(wèn)題胎食,下回分解。
- 如果將項(xiàng)目運(yùn)行在高版本手機(jī)上可以實(shí)現(xiàn)需求嗎允懂?如何解決 厕怜?
代碼樣例
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.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:
//打開(kāi)相機(jī)
openCameraForResult();
break;
}
}
/**
* 圖片存儲(chǔ)路徑
*/
private String mImageFilePath;
/**
* 構(gòu)建圖片路徑
* 將圖片保存在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;
}
/**
* 打開(kāi)相機(jī)
*/
private void openCameraForResult() {
//創(chuàng)建intent ,設(shè)置action
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//構(gòu)建圖片路徑
createImageFilePath();
//將捕獲的圖片保存在imageUri
intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
//調(diào)用相機(jī)
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) {
//這里不能通過(guò)Intent對(duì)象去獲取"data"蕾总,
// 因?yàn)樵诖蜷_(kāi)相機(jī)時(shí)已經(jīng)通過(guò)MediaStore.EXTRA_OUTPUT告訴相機(jī):你把圖片放在我傳給你的Uri中
//所以可以直接通過(guò)BitmapFactory在存儲(chǔ)路徑中獲取圖片
Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
imageView.setImageBitmap(bitmap);
}
}
}
3.AndroidManifest.xml中需要添加權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>