1. 程式人生 > >安卓呼叫手機的相簿與相機獲取圖片並適配到控制元件

安卓呼叫手機的相簿與相機獲取圖片並適配到控制元件

在之前做專案的時候用到了調取系統相機的工能所以在這裡做了一下總結,這是本人第一次寫東西有很多不懂得地方或者有解釋不明白的地方 希望大家前來指正不多說直接上程式碼:

首先是佈局頁面

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >


    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginLeft="16dp"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:onClick="onClick"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="獲取相簿" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:onClick="onClick"
        android:text="相機拍照" />

</LinearLayout>
這個部分很簡單 就不多說了,接下來是主頁面Mainactivity.class
public class MainActivity extends Activity implements OnClickListener {
	
<span style="white-space:pre">	</span>//這裡大家可以用XUtils進行處理,我沒有做處理
	private ImageView imageView;
	private Button button1, button2;

	/** 防止因為相機格式引發錯誤 */
	@Override
	public void onConfigurationChanged(Configuration config) {
		super.onConfigurationChanged(config);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initinto();
	}

	/** 例項化控制元件 */
	public void initinto() {
		imageView = (ImageView) findViewById(R.id.imageView1);
		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			Log.d("DDD", "點選了選取相簿按鈕button1");
			getPhotoFromxiangce();
			break;
		case R.id.button2:
			Log.d("DDD", "點選了選取相簿按鈕button2");
			getPhotofromxiangji();
			break;
		default:
			break;
		}
	}

	/** 自己定義的名字 */
	private String localTempImgDir = "localTempImgDir",
			localTempImgFileName = "localTempImgFileName";
	private String filePath;// 圖片的URL
	private static final String IMAGE_UNSPECIFIED = "image/*";
	private static Uri urii;
	private static final int GET_IMAGE_VIA_CAMERA = 1;// 相機
	private static final int PHOTO_ZOOM = 2; // 縮放
	private static final int PHOTO_RESOULT = 3;// 結果
	public static final int NULL_ID = -1;

	/** 獲取相簿圖片的方法 */
	public void getPhotoFromxiangce() {
		Log.d("DDD", "getPhotoFromxiangce執行了>>>>>>>>");
		// 進入相簿新增一張圖片
		Intent intent = new Intent(Intent.ACTION_PICK, null);
		intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
				IMAGE_UNSPECIFIED);
		startActivityForResult(intent, PHOTO_ZOOM);

	}

	/** 手機拍照的方法 */
	public void getPhotofromxiangji() {
		Log.d("DDD", "getPhotofromxiangji執行了>>>>>>>>");
		// 先驗證手機是否有sdcard
		String status = Environment.getExternalStorageState();
		if (status.equals(Environment.MEDIA_MOUNTED)) {
			try {
				File dir = new File(Environment.getExternalStorageDirectory()
						+ "/" + localTempImgDir);
				if (!dir.exists())
					dir.mkdirs();
				Intent intent = new Intent(
						android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
				File f = new File(dir, localTempImgFileName);// localTempImgDir和localTempImageFileName是自己定義的名字
				Uri u = Uri.fromFile(f);
				intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, u);
				startActivityForResult(intent, GET_IMAGE_VIA_CAMERA);
			} catch (ActivityNotFoundException e) {
				Toast.makeText(MainActivity.this, "沒有找到儲存目錄", Toast.LENGTH_LONG)
						.show();
			}
		} else {
			Toast.makeText(MainActivity.this, "沒有儲存卡", Toast.LENGTH_LONG)
					.show();
		}

	}

	/** 在onActivityResult中這樣折騰: */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d("DDD", "正在執行onActivityResult()方法");
		if (resultCode == RESULT_OK) {
			switch (requestCode) {
			// 直接進入相簿
			case PHOTO_ZOOM:
				buqianqie(data.getData());
				// startPhotoZoom(data.getData());
				break;
			// 相機方法監聽
			case GET_IMAGE_VIA_CAMERA:
				File f = new File(Environment.getExternalStorageDirectory()
						+ "/" + localTempImgDir + "/" + localTempImgFileName);
				try {
					Uri u = Uri.parse(android.provider.MediaStore.Images.Media
							.insertImage(getContentResolver(),
									f.getAbsolutePath(), null, null));
					// u就是拍攝獲得的原始圖片的uri,剩下的你想幹神馬壞事請便……
					 startPhotoZoom(u);
				//	buqianqie(u);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				break;
			// // 處理結果,剪下圖片
			 case PHOTO_RESOULT:
			 Bundle extras = data.getExtras();
			 if (extras != null) {
			 Bitmap photo = extras.getParcelable("data");
			 ByteArrayOutputStream stream = new ByteArrayOutputStream();
			 photo.compress(Bitmap.CompressFormat.PNG, 100, stream);//
		//	 (0-100)壓縮檔案
			 imageView.setImageBitmap(photo); // 把圖片顯示在ImageView控制元件上
			 }
			 break;
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	/** 不剪下圖片 */
	public void buqianqie(Uri uri) {
		Log.d("DDD", "uri>>>>>>>>>>>"+uri);
		imageView.setImageResource(NULL_ID);
		imageView.setImageURI(uri);
		Log.d("DDD", "正在執行buqianqie()方法");
		urii = uri;
		filePath = getUrlFromUri(this, uri);
//		Bitmap bitmap = getBitmapFromUri(urii, this);
//		imageView.setImageBitmap(bitmap);
	}

	/** 剪下圖片 */
	public void startPhotoZoom(Uri uri) {
		Log.d("DDD", "正在執行startPhotoZoom()方法");
		Intent intent = new Intent("com.android.camera.action.CROP");
		urii = uri;
		filePath = getUrlFromUri(this, uri);
		intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
		intent.putExtra("crop", "true");
		// aspectX aspectY 是寬高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪圖片寬高
		intent.putExtra("outputX", 64);
		intent.putExtra("outputY", 64);
		intent.putExtra("return-data", true);
		startActivityForResult(intent, PHOTO_RESOULT);
	}

	/** 根據uri獲取檔案的路徑URL */
	public String getUrlFromUri(final Context context, final Uri uri) {
		Log.d("DDD", "正在執行getUrlFromUri()方法");
		if (null == uri)
			return null;
		final String scheme = uri.getScheme();
		String data = null;
		if (scheme == null)
			data = uri.getPath();
		else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
			data = uri.getPath();
		} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
			Cursor cursor = context.getContentResolver().query(uri,
					new String[] { ImageColumns.DATA }, null, null, null);
			if (null != cursor) {
				if (cursor.moveToFirst()) {
					int index = cursor.getColumnIndex(ImageColumns.DATA);
					if (index > -1) {
						data = cursor.getString(index);
					}
				}
				cursor.close();
			}
		}
		return data;
	}

	/** 通過uri轉換成bitmip */
	public static Bitmap getBitmapFromUri(Uri uri, Context mContext) {
		Log.d("DDD", "正在執行getBitmapFromUri()方法");
		try {
			// 讀取uri所在的圖片
			Bitmap bitmap = MediaStore.Images.Media.getBitmap(
					mContext.getContentResolver(), uri);
			Log.d("DDD", "bitmap方法"+bitmap.toString());
			return bitmap;
		} catch (Exception e) {
			Log.d("DDD", "Exception方法");
			e.printStackTrace();
			return null;
		}
	}

	/** 設定新增螢幕的背景透明度 */
	public void backgroundAlpha(float bgAlpha) {
		Log.d("DDD", "backgroundAlpha執行了>>>>>>>>");
		WindowManager.LayoutParams lp = this.getWindow().getAttributes();
		lp.alpha = bgAlpha; // 0.0-1.0
		this.getWindow().setAttributes(lp);
	}

	/** 新增新筆記時彈出的popWin關閉的事件,主要是為了將背景透明度改回來 */
	class poponDismissListener implements PopupWindow.OnDismissListener {

		@Override
		public void onDismiss() {
			Log.d("DDD", "poponDismissListener執行了>>>>>>>>onDismiss>>");
			backgroundAlpha(1f);
		}
	}

寫這個demo的時候是因為我本身的專案有相關的,就寫了這些功能,我在網上看了很多相關的demo,大部分功能多恨單一,我把可能需要的方法全都加進來了方便大家使用,那個設定背景透明度的方法是考慮到一些情況加入的,例如需要彈出pop視窗的時候,本專案中並沒有使用到,不想要的可以刪除。

大家使用的時候記得新增相關的許可權,否則可能執行不了