分享一個需要拍照的介面可以直接繼承的Activity,附帶詳細註解,activity註解

來源:互聯網
上載者:User

分享一個需要拍照的介面可以直接繼承的Activity,附帶詳細註解,activity註解

需要拍照的介面可以根據自己項目需求直接繼承該Activity,附帶詳細註解,拍照剪下專題會進行詳細講解,大結局篇給出一個完整的總結,

public abstract class RequestWithTakePhotoActivity extends BaseActivity {
private static final String IMAGE_UNSPECIFIED = "image/*";
private static final String IMAGE_TMP = "photo_tmp.png";
private static final String IMAGE_TMP_2 = "photo_tmp2.png";


private static final int TAKE_PHOTO = 0;
private static final int PIC_PHOTO = 1;
// private static final int CROP_PHOTO = 2;


private static final int CROP_BIG_PICTURE = 3;


private boolean enableCrop = true;
private static final int MAX_LINE = 480;
private Uri imageUri;
protected PopDialog dialog = null;
private ArrayList<Integer> save_images_arr_id = new ArrayList<Integer>();
private ArrayList<String> save_images_arr_paths = new ArrayList<String>();
public final static int GET_PHOTO_RESULT_ID = 6;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


File outFile = new File(getExternalCacheDir() + "/" + IMAGE_TMP);
imageUri = Uri.fromFile(outFile);
//測試後會發現並沒有進入到onCreate方法//不對,雖然不是構造方法,但是子類實現onCrreate方法的時候的super.onCreate(savedInstanceState);就會指向這裡的代碼
Log.i("ResquestWithTakePotoActivity", "拍照時進入到ResquestWithTakePotoActivity");
}


protected void enableCrop(boolean flag) {//子類用於設定能否剪下的標誌
enableCrop = flag;
}


public void imageChooseItem(boolean isShowSelectPhoto) {
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.take_photo_select, null);
view.findViewById(R.id.photo_delete).setVisibility(View.GONE);
view.findViewById(R.id.take_photo).setOnClickListener(
new OnClickListener() {


@Override
public void onClick(View v) {
startActionCamera();//拍照按鈕點擊後,啟動照相機
if (dialog != null) {
dialog.cancel();
}
}
});
if (isShowSelectPhoto) {
view.findViewById(R.id.pic_photo).setVisibility(View.VISIBLE);
view.findViewById(R.id.take_photo_line).setVisibility(View.VISIBLE);
view.findViewById(R.id.pic_photo).setOnClickListener(
new OnClickListener() {


@Override
public void onClick(View v) {
// startImagePick();
SelectPhoto();
if (dialog != null) {
dialog.cancel();
}
}
});


} else {
view.findViewById(R.id.take_photo_line).setVisibility(View.GONE);
view.findViewById(R.id.pic_photo).setVisibility(View.GONE);
}


dialog = DialogUtil.showInfo(this,
getResources().getString(R.string.title_select), view,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}, false, false);
}


public void imageChooseItemWithDelete(int type, final int index,
boolean isSetBitmap) {
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.take_photo_select, null);
Log.e("hf:issetbitamp", isSetBitmap + "");
if (isSetBitmap) {
view.findViewById(R.id.take_photo_line).setVisibility(View.VISIBLE);
view.findViewById(R.id.photo_delete).setVisibility(View.VISIBLE);


} else {
view.findViewById(R.id.photo_delete).setVisibility(View.GONE);
view.findViewById(R.id.take_photo_line).setVisibility(View.GONE);
}


view.findViewById(R.id.pic_photo).setOnClickListener(
new OnClickListener() {


@Override
public void onClick(View v) {
// startImagePick();
SelectPhoto();
if (dialog != null) {
dialog.cancel();
}
}
});


view.findViewById(R.id.take_photo).setOnClickListener(
new OnClickListener() {


@Override
public void onClick(View v) {
startActionCamera();
if (dialog != null) {
dialog.cancel();
}
}
});


view.findViewById(R.id.photo_delete).setOnClickListener(
new OnClickListener() {


@Override
public void onClick(View v) {
deleteImage(index);
if (dialog != null) {
dialog.cancel();
}
}
});


dialog = DialogUtil.showInfo(this,
getResources().getString(R.string.title_select), view,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}, false, false);


}


abstract protected void deleteImage(int index);


private void startActionCamera() {//以startActivityForResult的方式跳轉到照相機介面
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// action is
// capture
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//另存圖片地址  
startActivityForResult(intent, TAKE_PHOTO);
}


private void startImagePick(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", getCropX());
intent.putExtra("aspectY", getCropY());
intent.putExtra("outputX", getCropWidth());
intent.putExtra("outputY", getCropHeight());
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra("scaleUpIfNeeded", true);// 解決當圖片大小小於輸出大小時,部分機器截取圖片黑邊
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", false); // no face detection
startActivityForResult(intent, PIC_PHOTO);
}


private void SelectPhoto() {
Intent intent = new Intent();
intent.setClass(this, SelectFromPhotoAlbumActivity.class);
intent.putExtra("TYPE", "single_pic");
intent.putExtra("SELECTED_IMAGES", save_images_arr_paths);
intent.putExtra("SELECTED_IMAGES_ID", save_images_arr_id);
startActivityForResult(intent, GET_PHOTO_RESULT_ID);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PHOTO:
Log.e("hfdd:", imageUri + "");
if (resultCode != Activity.RESULT_CANCELED) {
cropImageUri(imageUri, CROP_BIG_PICTURE);
}


break;


case CROP_BIG_PICTURE:// from crop_big_picture
Log.e("hf:", imageUri + "");
if (imageUri != null) {
Bitmap bitmap = decodeUriAsBitmap(imageUri);
onImageCroped(bitmap);
} else {
return;
}
break;


case PIC_PHOTO:
if (imageUri != null) {
Bitmap bitmap = decodeUriAsBitmap(imageUri);
onImageCroped(bitmap);
} else {
return;
}


break;
case GET_PHOTO_RESULT_ID:
if (data != null) {
ArrayList<Integer> images_arr_id = data
.getIntegerArrayListExtra("select_photos");
ArrayList<String> images_arr_paths = data
.getStringArrayListExtra("select_photos_paths");
Uri uri = Uri.parse("file://" + images_arr_paths.get(0));
startImagePick(uri);
}

break;


}
super.onActivityResult(requestCode, resultCode, data);
}


private Bitmap decodeUriAsBitmap(Uri uri) {
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}




private void cropImageUri(Uri uri, int requestCode) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", getCropX());
intent.putExtra("aspectY", getCropY());
intent.putExtra("outputX", getCropWidth());
intent.putExtra("outputY", getCropHeight());
intent.putExtra("scale", true);
intent.putExtra("scaleUpIfNeeded", true);// 解決當圖片大小小於輸出大小時,部分機器截取圖片黑邊
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, requestCode);
}


protected boolean savePicture(Bitmap image, File picture) {
if (!picture.exists()) {
try {
File path = new File(picture.getParent());
if (!path.exists()) {
if (!path.mkdirs()) {
return false;
}
}
if (!picture.createNewFile()) {
return false;
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
BufferedOutputStream stream;


try {
stream = new BufferedOutputStream(new FileOutputStream(picture));
image.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}


abstract protected int getCropWidth();


abstract protected int getCropHeight();


abstract protected int getCropX();


abstract protected int getCropY();


abstract protected void onImageCroped(Bitmap image);


abstract protected void onImageSelected(Uri uri);
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.