调用android系统的图库以及截图来让用户自定义界面背景

                     关键代码只有几行,下面是具体的项目实践

第一步:

/**
	 * 调用系统图库来让用户自定义背景图片
	 */
	private void setingBackground() {
		
		
		// 从图库选择图片
		System.out.println("---------------------------------------从图库选择图片");
		Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"

		innerIntent.setType("image/*"); // 查看类型

		// StringIMAGE_UNSPECIFIED="image/*";详细的类型在com.google.android.mms.ContentType中

		Intent wrapperIntent = Intent.createChooser(innerIntent, null);

		startActivityForResult(wrapperIntent, SETINGBACKGROUND);
	}


第二步:

                    

然而,这是在我缺少附加的文档,不知道这些选项的具体含义等等情况之下的选择。所以,我将我的yanj整理成一个表格 ,并写了一个演示程序,力图演示控制此功能的所有可供选项。

你可以在你的程序中使用使用我的代码,并且扩展它。我会将之附加在这篇文章上。

Exta Options Table for image/* crop:

                                                      附加选项          数据类型          描述 
                                                       crop                   String               发送裁剪信号 
                                                       aspectX             int                     X方向上的比例 
                                                       aspectY              int                    Y方向上的比例 
                                                       outputX               int                    裁剪区的宽
                                                       outputY                int                    裁剪区的高
                                                       scale                    boolean          是否保留比例
return-data boolean 是否将数据保留在Bitmap中返回
data Parcelable 相应的Bitmap数据
circleCrop String 圆形裁剪区域?
MediaStore.EXTRA_OUTPUT ("output") URI 将URI指向相应的file:///...,详见代码示例

现在,最令人困惑的是MediaStore.EXTRA_OUTPUT以及return-data选项。

你主要有两种方式从这个Intent中取得返回的bitmap:获取内部数据或者提供一个Uri以便程序可以将数据写入。

 

 /**
	 * 返回后接收并调用系统裁剪工具 在裁剪图片时,遇到有些图片不能按照某一指定的比例进行裁剪,查看了源码后才知道:
	 * 系统的裁剪图片默认对图片进行人脸识别,当识别到有人脸时,会按aspectX和aspectY为1来处理,
	 * 如果想设置成自定义的裁剪比例,需要设置noFaceDetection为true。
	 * 
	 * 即iintent.putExtra("noFaceDetection", true); 取消人脸识别功能。
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode,
			Intent intent) {
		System.out.println("requestCode="+requestCode+",resultCode="+resultCode+",intent="+intent);
		System.out
				.println("-----------------------------------------得到返回的图片uri");
		if (requestCode == SETINGBACKGROUND) {
			if (intent != null) {
				Uri uri = intent.getData();
				
				if (uri != null) {
					
					//依照需求进行分辨时需要横屏还是竖屏进行截取
					int width = getWindowManager().getDefaultDisplay().getWidth();
					int height = getWindowManager().getDefaultDisplay().getHeight();
					
					final Intent intent1 = new Intent(
							"com.android.camera.action.CROP");
					intent1.setDataAndType(uri, "image/*");
					intent1.putExtra("crop", "true");
					intent1.putExtra("aspectX", 1);
					intent1.putExtra("aspectY", 1);
					
					if(screenType){
						//需要是竖屏
						intent1.putExtra("outputX", width);
						intent1.putExtra("outputY", height);
					}
					else{
						//需要的是横屏
						intent1.putExtra("outputX", height);
						intent1.putExtra("outputY", width);
					}
					intent1.putExtra("return-data", true);
					intent1.putExtra("noFaceDetection", true);
					startActivityForResult(intent1, TAILOR_IMAGE);

				}
			}
		}


		else if (requestCode == TAILOR_IMAGE) {
			System.out
					.println("----------------------------------------------得到裁剪后的图片");
			if (intent != null) {
				Bitmap bm = intent.getParcelableExtra("data");
				
				//立即修改背景
				BitmapDrawable drawable = new BitmapDrawable(bm);
				layout_left.setBackgroundDrawable(drawable);
				
				String path = null;
				//看需求是需要横屏还是竖屏,true为竖屏
				if(screenType){
					if(whatActivity){
						//歌曲界面
						path = ConstantValue.MusicVertical;
					}
					else{
						//歌词界面
						path = ConstantValue.LyricVertical;
					}
					
				}
				else{
					//横屏路径
					path = ConstantValue.horizontal;
				}
				
				File file = new File(path);
				
				try {
					file.delete();
					file.createNewFile();
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
			        bm.compress(Bitmap.CompressFormat.JPEG, 80, baos);
			        baos.flush();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值