Android實(shí)現(xiàn)拍照截取和相冊(cè)圖片截取
關(guān)于拍照截取和相冊(cè)截取,看了網(wǎng)上很多資料,自己整理了一份比較詳細(xì)的,供有需要的人參考
1 拍照
原理就是通過intent調(diào)用系統(tǒng)的相機(jī),拍完照在回調(diào)進(jìn)行操作,成功獲取到拍完照的圖片根據(jù)uri調(diào)用系統(tǒng)的裁剪頁面,裁剪完也是在回調(diào)中進(jìn)行處理,顯示在頁面的imageview中。
2 相冊(cè)選取圖片
原理也是通過intent打開系統(tǒng)的圖片,用戶選擇完成以后在回調(diào)中根據(jù)圖片的uri調(diào)用系統(tǒng)的裁剪頁面,同上。
首先,定義幾個(gè)常量
public static final int TAKE_PHOTO = 1; public static final int CROP_PHOTO = 2; public static final int ACTION_CHOOSE=3; private Uri imageUri; //圖片路徑 private String filename; //圖片名稱
然后在拍照和相冊(cè)選擇的按鈕中處理事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt1: //拍照截取
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
filename = format.format(date);
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File outputImage = new File(path, filename +".jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//將File對(duì)象轉(zhuǎn)換為Uri并啟動(dòng)照相程序
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //照相
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //指定圖片輸出地址
startActivityForResult(intent, TAKE_PHOTO); //啟動(dòng)照相
break;
case R.id.bt2: //相冊(cè)選取
Intent intent2 = new Intent(Intent.ACTION_PICK);
intent2.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent2,ACTION_CHOOSE);
break;
}
}
最主要的在回調(diào)中的執(zhí)行
// 使用startActivityForResult返回結(jié)果時(shí)調(diào)用的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode!=RESULT_OK){
Toast.makeText(this, "取消了", Toast.LENGTH_SHORT).show();
return;
}
switch (requestCode) {
case TAKE_PHOTO: //拍照的回調(diào)
cropImage();
break;
case ACTION_CHOOSE: //選擇照片的回調(diào)
imageUri = data.getData();
cropImage();
break;
case CROP_PHOTO: //裁剪完照片的回調(diào)
showPic();
break;
default:
break;
}
}
裁剪圖片的方法
/**
* 裁剪圖片
**/
private void cropImage() {
Intent intent = new Intent("com.android.camera.action.CROP"); //剪裁
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
//設(shè)置寬高比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//設(shè)置裁剪圖片寬高
intent.putExtra("outputX", 340);
intent.putExtra("outputY", 340);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
Toast.makeText(MainActivity.this, "剪裁圖片", Toast.LENGTH_SHORT).show();
//廣播刷新相冊(cè)
Intent intentBc = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intentBc.setData(imageUri);
this.sendBroadcast(intentBc);
startActivityForResult(intent, CROP_PHOTO); //設(shè)置裁剪參數(shù)顯示圖片至ImageView
}
過程比較簡(jiǎn)單,可能會(huì)有一些判斷的地方?jīng)]有處理,如果有不對(duì)的地方希望有高手可以幫忙改進(jìn),謝謝~~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android利用Sensor(傳感器)實(shí)現(xiàn)水平儀功能
這篇文章主要為大家詳細(xì)介紹了Android利用Sensor傳感器實(shí)現(xiàn)水平儀功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android通過交互實(shí)現(xiàn)貝塞爾曲線的繪制
本篇我們將介紹簡(jiǎn)單的交互式繪圖,通過獲取觸控位置來設(shè)定貝塞爾曲線的控制點(diǎn),從而實(shí)現(xiàn)交互式繪制曲線,感興趣的小伙伴可以了解一下2022-05-05
Input系統(tǒng)之InputReader處理觸摸事件案例
這篇文章主要為大家介紹了Input系統(tǒng)之InputReader處理觸摸事件案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Android源碼探究之BaseDexClassLoader的使用
今天解決一個(gè)插件化問題的時(shí)候,竟然發(fā)現(xiàn)SO沒有正常加載,很怪異,最終排查下來發(fā)現(xiàn)竟然是參數(shù)傳入錯(cuò)誤導(dǎo)致的。這就扯到了本文的標(biāo)題上了,BaseDexClassLoader中的4個(gè)參數(shù)該如何傳入,傳入的又是什么呢2022-08-08
Android實(shí)現(xiàn)顏色漸變動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)顏色漸變動(dòng)畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

