关键代码只有几行,下面是具体的项目实践
第一步:
/**
* 调用系统图库来让用户自定义背景图片
*/
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(); } } }
}