最近做完一个项目,把自己遇到好的代码都记录下来。
差不多每个项目都会有个人信息界面吧,那就少不了头像,那么切换头像肯定是必须有的。我在这个项目中用的系统相机和系统相册,我觉得这部分没有必要自己写。
下面就分步骤讲讲使用过程。
第一步:权限
有两个权限必须申请,相机权限,读写SD卡
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
第二步:还是申请权限,如果手机是6.0的有时候发现相机用不了,这就是棉花糖,具体的可以去网上看看棉花糖机制。这里主要讲讲申请相机的权限。我之前也写过关于android6.0申请相机权限的。我就直接贴代码了。
/**
* 申请权限
*/
private void requestPermission() {
// 判断当前Activity是否已经获得了该权限
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// 如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
showAlert("请进入设置-应用管理-打开相机权限");
} else {
// 进行权限请求
ActivityCompat
.requestPermissions(
this,
new String[]{Manifest.permission.CAMERA},
111);
}
} else {
showChoseDialog();
}
}
/**
* 申请权限的结果
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 111: {
// 如果请求被拒绝,那么通常grantResults数组为空
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 申请成功,进行相应操作
showChoseDialog();
} else {
// 申请失败,可以继续向用户解释。
showAlert("没有相机权限,您可能无法使用相机,请在应用管理中打开“相机”访问权限!");
}
return;
}
}
}
第三步:弹出选择框
/**
* 弹出选择框
*/
private void showChoseDialog() {
String title = "选择获取图片方式";
String[] items = new String[]{"拍照", "相册"};
new AlertDialog.Builder(this)
.setTitle(title)
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
switch (which) {
case 0:
//拍照
choseCamera();
break;
case 1:
//相册
choseAlbum();
break;
default:
break;
}
}
})
.show();
}
第四步:选择拍照和相册
/**
* 选择了相机
*/
private void choseCamera() {
File file = new File(HEAD_PATH);
if (!file.exists()) {
file.mkdir();
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(HEAD_PATH + "userHead.jpg")));
startActivityForResult(intent, 112);
}
/**
* 选择了相册
*/
private void choseAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, 113);
}
第五步:因为跳转到了系统相机和系统相册,所以数据都返回到onactivityResult里了。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 113:
if (resultCode == RESULT_OK) {
cropPhoto(data.getData());// 裁剪图片
}
break;
case 112:
if (resultCode == RESULT_OK) {
File temp = new File(HEAD_PATH + "userHead.jpg");
cropPhoto(Uri.fromFile(temp));// 裁剪图片
}
break;
case 114:
if (data != null) {
Bundle extras = data.getExtras();
headBitmap = extras.getParcelable("data");
if (headBitmap != null) {
circularImageView.setImageBitmap(headBitmap);
setPicToSdCard(headBitmap);
}
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 调用系统的裁剪
*
* @param uri
*/
public void cropPhoto(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 200);
intent.putExtra("return-data", true);
startActivityForResult(intent, 114);
}
第六步:保存到SD卡中。最好是保存到卡中,以后的上传的服务器都要用到。
/**
* 保存到SD卡
*
* @param mBitmap
*/
private void setPicToSdCard(Bitmap mBitmap) {
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
return;
}
FileOutputStream b = null;
File file = new File(HEAD_PATH);
if (!file.exists()) {
file.mkdirs();// 创建文件夹
}
String fileName = HEAD_PATH + "cropHead.jpg";// 图片名字
try {
b = new FileOutputStream(fileName);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 80, b);// 把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
// 关闭流
b.flush();
b.close();
} catch (IOException e) {
e.printStackTrace();
}
//TODO:保存完,将File发送服务器
//File file = new File(HEAD_PATH + "cropHead.jpg");
}
}
不懂得加我QQ吧,我也不想解释了,都很简单。代码没有粘贴完想要源码和不懂的私聊我吧!QQ号821651400。