安卓调用手机的相册与相机获取图片并适配到控件

在之前做项目的时候用到了调取系统相机的工能所以在这里做了一下总结,这是本人第一次写东西有很多不懂得地方或者有解释不明白的地方 希望大家前来指正不多说直接上代码:

首先是布局页面

<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窗口的时候,本项目中并没有使用到,不想要的可以删除。

大家使用的时候记得添加相关的权限,否则可能运行不了
 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值