調用系統拍照和相冊的集成工具類(包含Popwindow的使用)

調用系統拍照和相冊的集成工具類(包含Popwindow的使用):

package com.example.takevideo;

import java.io.File;
import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Handler;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;

public class PhotoPopWindow {

	private String TAG = "MyPopWindow";
	private Context mContext;
	private PopupWindow pop;
	private RelativeLayout parent;
	public Button bt1;
	public Button bt2;
	public Button bt3;

	/** 拍的照片文件 */
	private File take_photo_file;

	public PhotoPopWindow(Context context) {

		mContext = context;
		initPopView();
		initPopListener();

	}

	public PopupWindow getPop() {
		return pop;
	}

	public void initPopView() {

		pop = new PopupWindow(mContext);
		// 設置pop的佈局視圖
		View view = ((Activity) mContext).getLayoutInflater().inflate(
				R.layout.my_popwindow, null);
		// 設置pop的屬性
		pop.setWidth(LayoutParams.MATCH_PARENT);
		pop.setHeight(LayoutParams.MATCH_PARENT);
		pop.setBackgroundDrawable(new BitmapDrawable());
		pop.setFocusable(true);
		pop.setOutsideTouchable(true);
		pop.setContentView(view);

		parent = (RelativeLayout) view.findViewById(R.id.parent);
		bt1 = (Button) view.findViewById(R.id.my_popwindow_camera);
		bt2 = (Button) view.findViewById(R.id.my_popwindow_photo);
		bt3 = (Button) view.findViewById(R.id.my_popwindow_cancel);

	}

	private void initPopListener() {

		parent.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				pop.dismiss();
			}
		});

		bt1.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {

				pop.dismiss();

				LogUtil.i(TAG, "照相");
				// 照相
				// 拍照的臨時緩存
				File destDir = new File(Constants.IMAGES_DIR);
				if (!destDir.exists()) {
					destDir.mkdirs();
				}
				// 拍得照片的路徑
				String take_photo_path = Constants.IMAGES_DIR
						+ System.currentTimeMillis() + ".png";
				take_photo_file = new File(take_photo_path);
				if (!take_photo_file.exists()) {
					try {
						// 在指定的文件夾中創建文件
						take_photo_file.createNewFile();
					} catch (Exception e) {
					}
				}

				Uri imageUri = Uri.fromFile(take_photo_file);
				Intent openCameraIntent = new Intent(
						MediaStore.ACTION_IMAGE_CAPTURE);
				// 指定照片保存路徑(SD卡),image.png爲一個臨時文件,每次拍照後這個圖片都會被替換
				if (imageUri != null) {
					openCameraIntent
							.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
				}
				((Activity) mContext).startActivityForResult(openCameraIntent,
						Constants.CAMERA_WITH_DATA);

			}
		});

		bt2.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				pop.dismiss();
				// 相冊
				Intent intent = new Intent();
				intent.setType("image/*");
				intent.setAction(Intent.ACTION_PICK);
				((Activity) mContext).startActivityForResult(intent,
						Constants.PHOTO_PICKED_WITH_DATA);
			}
		});
		bt3.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// 取消
				pop.dismiss();
			}
		});
	}

	/**
	 * 返回拍照的或相冊中的照片文件
	 * 
	 * @param requestCode
	 * @param resultCode
	 * @param data
	 * @return
	 */
	public File INonActivityResult(int requestCode, int resultCode, Intent data) {
		LogUtil.i(TAG, "onActivityResult");

		switch (requestCode) {
		case Constants.CAMERA_WITH_DATA: {
			// 照相機程序返回的
			// return ImageUtil.rotateImage(take_photo_file.getAbsoluteFile());
			return take_photo_file;

		}
		case Constants.PHOTO_PICKED_WITH_DATA: {
			if (data == null) {
				return null;
			}
			// 照片的原始資源地址
			Uri uri_picture = data.getData();
			return new File(getImagePath(uri_picture));
		}
		default:
			break;
		}
		return null;
	}

	/**
	 * 得到相冊中圖片的路徑
	 * 
	 * @return
	 */
	public String getImagePath(Uri originalUri) {
		String[] proj = { MediaStore.Images.Media.DATA };

		// 好像是android多媒體數據庫的封裝接口,具體的看Android文檔
		Cursor cursor = ((Activity) mContext).managedQuery(originalUri, proj,
				null, null, null);
		// 按我個人理解 這個是獲得用戶選擇的圖片的索引值
		int column_index = cursor
				.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		// 將光標移至開頭 ,這個很重要,不小心很容易引起越界
		cursor.moveToFirst();
		// 最後根據索引值獲取圖片路徑
		String path = cursor.getString(column_index);
		return path;
	}

	/**
	 * 調用系統的裁剪
	 * 
	 * @param uri
	 */
	public void cropPhoto(Uri uri) {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		intent.putExtra("crop", "true");
		// aspectX aspectY 是寬高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪圖片寬高
		intent.putExtra("outputX", 150);
		intent.putExtra("outputY", 150);
		intent.putExtra("return-data", true);
		((Activity) mContext).startActivityForResult(intent,
				Constants.CROP_PICKED_WITH_DATA);
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章