1. 程式人生 > >上傳檔案之獲取拍照照片和本地相簿

上傳檔案之獲取拍照照片和本地相簿

// 上傳圖片
	private CharSequence[] items = { "選擇本地圖片", "拍照" };
	private final int SELECT_LOCAL = 0, SELECT_CAMER = 1, PICTURE_CROP = 2,
			PICTURE_FRESH = 3;

	/**
	 * 修改個人圖片
	 */
	public void modifyPhoto() {
		Builder builder = new AlertDialog.Builder(mContext);
		AlertDialog dialog = builder.setTitle("請選擇圖片來源")
				.setItems(items, new PhotoDialogClickListener()).create();
		dialog.setCanceledOnTouchOutside(true);
		dialog.setCancelable(true);
		dialog.show();
	}

	/**
	 * 選擇對話方塊
	 */
	private class PhotoDialogClickListener implements
			DialogInterface.OnClickListener {
		@Override
		public void onClick(DialogInterface dialog, int which) {
			switch (which) {
			case SELECT_LOCAL:
				methodURI(which);
				break;
			case SELECT_CAMER:
				methodURI(which);
				break;
			default:
				break;
			}
		}
	}

	/**
	 * 適合S3, 小米
	 * 
	 * @param intent
	 * @param requestCode
	 */
	private void methodURI(int requestCode) {
		Intent intent = null;
		switch (requestCode) {
		case SELECT_LOCAL:
			intent = new Intent(Intent.ACTION_GET_CONTENT);
			intent.addCategory(Intent.CATEGORY_OPENABLE);
			intent.setType("image/*");
			startActivityForResult(Intent.createChooser(intent, "選擇圖片"),
					SELECT_LOCAL);
			break;
		case SELECT_CAMER:
			intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			startActivityForResult(intent, SELECT_CAMER);
			break;
		default:
			break;
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (data == null)
			return;
		Uri uri = data.getData();
		if (resultCode == RESULT_OK) {
			Bundle extras = data.getExtras();
			if (requestCode == SELECT_LOCAL || requestCode == SELECT_CAMER) {
				if (uri != null) {
					startPictureCrop(data.getData());
				} else if (extras != null) {
					updateView(data);
				}
			} else if (requestCode == PICTURE_CROP && data != null) {
				updateView(data);
			}
		}
	}

	/**
	 * 更新photo
	 * 
	 * @param data
	 */
	private void updateView(Intent data) {
		Bundle extras = data.getExtras();
		if (extras != null) {
			new Thread(new PictureThread(extras)).start();
		}
	}

	class PictureThread implements Runnable {
		private Bundle bundle;

		public PictureThread(Bundle extras) {
			bundle = extras;
		}

		@Override
		public void run() {
			Message msg = new Message();
			msg.what = PICTURE_FRESH;
			msg.setData(bundle);
			uploadHeadPhoto(bundle);
		}
	}

	/**
	 * 開始裁剪圖片
	 * 
	 * @param pictureUri
	 *            圖片URI
	 */
	private void startPictureCrop(Uri pictureUri) {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(pictureUri, "image/*");
		intent.putExtra("crop", "true");
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		intent.putExtra("outputX", 150);
		intent.putExtra("outputY", 150);
		intent.putExtra("return-data", true);
		startActivityForResult(intent, PICTURE_CROP);
	}