Android開發之呼叫相機拍照與本地相簿選擇圖片
阿新 • • 發佈:2019-01-08
使用者看到的介面如下,也是我的xml介面:
demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖:
點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖:
這時候你可以直接點選確定,也可以拖動裁剪的區域,選擇你想要顯示的區域再點選確定。
如果點的是相簿,會首先進入相簿介面,然後你可以選擇想要展示的圖片,然後開始裁剪並展示,如下圖示:
上面三張圖片就是開啟相簿操作的幾步。
- 實現程式碼如下:
package com.example.demo.getpicturedemo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
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.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
public class MainActivity extends Activity {
private static final int TAKE_PHOTO = 11;// 拍照
private static final int CROP_PHOTO = 12;// 裁剪圖片
private static final int LOCAL_CROP = 13;// 本地相簿
private Button btn_choose_picture;
private ImageView iv_show_picture;
private Uri imageUri;// 拍照時的圖片uri
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setViews();// 初始化控制元件
setListeners();// 設定監聽
}
/**
* 設定監聽
*/
private void setListeners() {
// 展示圖片按鈕點選事件
btn_choose_picture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
takePhotoOrSelectPicture();// 拍照或者呼叫相簿
}
});
}
/**
*
*/
private void takePhotoOrSelectPicture() {
CharSequence[] items = {"拍照","相簿"};// 裁剪items選項
// 彈出對話方塊提示使用者拍照或者是通過本地相簿選擇圖片
new AlertDialog.Builder(MainActivity.this)
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
// 選擇了拍照
case 0:
// 建立檔案儲存拍照的圖片
File takePhotoImage = new File(Environment.getExternalStorageDirectory(), "take_photo_image.jpg");
try {
// 檔案存在,刪除檔案
if(takePhotoImage.exists()){
takePhotoImage.delete();
}
// 根據路徑名自動的建立一個新的空檔案
takePhotoImage.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
// 獲取圖片檔案的uri物件
imageUri = Uri.fromFile(takePhotoImage);
// 建立Intent,用於啟動手機的照相機拍照
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 指定輸出到檔案uri中
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
// 啟動intent開始拍照
startActivityForResult(intent, TAKE_PHOTO);
break;
// 呼叫系統圖庫
case 1:
// 建立Intent,用於開啟手機本地相簿選擇圖片
Intent intent1 = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// 啟動intent開啟本地相簿
startActivityForResult(intent1,LOCAL_CROP);
break;
}
}
}).show();
}
/**
* 呼叫startActivityForResult方法啟動一個intent後,
* 可以在該方法中拿到返回的資料
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:// 拍照
if(resultCode == RESULT_OK){
// 建立intent用於裁剪圖片
Intent intent = new Intent("com.android.camera.action.CROP");
// 設定資料為檔案uri,型別為圖片格式
intent.setDataAndType(imageUri,"image/*");
// 允許裁剪
intent.putExtra("scale",true);
// 指定輸出到檔案uri中
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
// 啟動intent,開始裁剪
startActivityForResult(intent, CROP_PHOTO);
}
break;
case LOCAL_CROP:// 系統圖庫
if(resultCode == RESULT_OK){
// 建立intent用於裁剪圖片
Intent intent1 = new Intent("com.android.camera.action.CROP");
// 獲取相簿所選圖片的uri
Uri uri = data.getData();
intent1.setDataAndType(uri,"image/*");
// 設定裁剪圖片的寬高
intent1.putExtra("outputX", 300);
intent1.putExtra("outputY", 300);
// 裁剪後返回資料
intent1.putExtra("return-data", true);
// 啟動intent,開始裁剪
startActivityForResult(intent1, CROP_PHOTO);
}
break;
case CROP_PHOTO:// 裁剪後展示圖片
if(resultCode == RESULT_OK){
try{
// 展示拍照後裁剪的圖片
if(imageUri != null){
// 建立BitmapFactory.Options物件
BitmapFactory.Options option = new BitmapFactory.Options();
// 屬性設定,用於壓縮bitmap物件
option.inSampleSize = 2;
option.inPreferredConfig = Bitmap.Config.RGB_565;
// 根據檔案流解析生成Bitmap物件
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri), null, option);
// 展示圖片
iv_show_picture.setImageBitmap(bitmap);
}
// 展示相簿中選擇裁剪後的圖片
if(data != null){
// 根據返回的data,獲取Bitmap物件
Bitmap bitmap = data.getExtras().getParcelable("data");
// 展示圖片
iv_show_picture.setImageBitmap(bitmap);
}
}catch (Exception e){
e.printStackTrace();
}
}
break;
}
}
/**
* 控制元件初始化
*/
private void setViews() {
btn_choose_picture = (Button)findViewById(R.id.btn_choose_picture);
iv_show_picture = (ImageView)findViewById(R.id.iv_show_picture);
}
}
不過多的解釋寫法思路了,註釋寫的很明白,大家自己去理解。而且寫法大同小異,網上的資料也很多,僅供大家參考學習。
- 最後大家別忘了最關鍵的一步,新增許可權:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然後給出我的demo的apk下載地址:下載apk安裝體驗
I AM CODEMAN
==================================