最近做了调用系统相机和相册,在其他博客中看到还有对图像进行剪切,大家都知道,我们在玩微信的时候,头像更换是方形图片,接下来我们就对这种情况具体进行描述:
必要的权限:
<uses-permission android:name="android.permission.CAMERA" />
布局:
<ImageView
android:id="@+id/mIcon"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_margin="10dp"
android:src="@mipmap/weixin_fenlei" />
代码:
在onCreat()方法中:
mIcon = (ImageView) findViewById(R.id.mIcon);
mIcon.setOnClickListener(this);
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.mIcon:
new AlertDialog.Builder(this)
.setPositiveButton("相机", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//动态权限:点击相机时获取相机权限
DongTaiShare();
//从相机获取图片
getPicFromCamera();
}
}).setNegativeButton("相册", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//从相册获取图片
getPicFromAlbm();
}
}).create().show();
break;
}
}
//添加动态权限
private void DongTaiShare() {
if (Build.VERSION.SDK_INT >= 23) {
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CALL_PHONE, Manifest.permission.READ_LOGS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.SET_DEBUG_APP, Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.GET_ACCOUNTS, Manifest.permission.WRITE_APN_SETTINGS, Manifest.permission.CAMERA};
ActivityCompat.requestPermissions(this, mPermissionList, 123);
}
}
//调用系统相机
private void getPicFromCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
}
//调用相册
private void getPicFromAlbm() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
// 调用相机后返回
case 1:
if (resultCode == RESULT_OK) {
final Bitmap photo = intent.getParcelableExtra("data");
//给头像设置你相机拍的照片
mIcon.setImageBitmap(photo);
}
break;
//调用相册后返回
case 2:
if (resultCode == RESULT_OK) {
Uri uri = intent.getData();
cropPhoto(uri);//裁剪图片
}
break;
//调用剪裁后返回
case 3:
Bundle bundle = intent.getExtras();
if (bundle != null) {
//在这里获得了剪裁后的Bitmap对象,可以用于上传
Bitmap image = bundle.getParcelable("data");
//设置到ImageView上
mIcon.setImageBitmap(image);
//也可以进行一些保存、压缩等操作后上传
String path = saveImage("userHeader", image);
File file = new File(path);
/*
*这里可以做上传文件的额操作
*/
}
break;
}
}
/**
* 裁剪图片
*/
private void cropPhoto(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}
/**
* 保存图片到本地
*
* @param name
* @param bmp
* @return
*/
public String saveImage(String name, Bitmap bmp) {
File appDir = new File(Environment.getExternalStorageDirectory().getPath());
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = name + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
再给大家来几张效果图:
这里只是简单的给大家介绍一个Android里的小功能,如果有什么不足,或者在使用过程中遇到了什么问题,可以留言,谢谢!
May everyone be happy every day and everything go well!