项目中用到更换头像和认证的功能 所以就写了这个 希望能帮到大家
由于本人技术比较差 写过的有些细节都忘得差不多了 有错希望可以提出
先放效果图给你们看看
首先呢 貌似用到了这两个权限。。貌似是因为我也记不清了 当时尝试了好几种方法 可能会有点乱 但是不会炸 en 貌似不会
//选择图片
implementation 'com.github.lovetuzitong:MultiImageSelector:1.2'
//安卓权限
implementation 'pub.devrel:easypermissions:1.3.0'
然后就是你需要调用相机相册的那个类需要实现下边这个接口
implements EasyPermissions.PermissionCallbacks
然后会有三个你需要重写的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//框架要求必须这么写
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
//成功打开权限
@Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
}
//用户未同意权限
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
// Toast.makeText(this, "请同意相关权限,否则功能无法使用", Toast.LENGTH_SHORT).show();
}
然后申请权限
private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
//获取权限
private void getPermission() {
if (EasyPermissions.hasPermissions(this, permissions)) {
//已经打开权限
} else {
//没有打开相关权限、申请权限
EasyPermissions.requestPermissions(this, "需要获取您的相册、照相使用权限", 1, permissions);
}
}
然后呢我是用了一个popupwindow来实现底部弹窗的效果
R.layout.item_change_icon 布局文件 布局不就不贴了吧 太没技术含量了。。
R.id.tvTakePhoto 布局文件里面的拍照id
R.id.tvSelectPhoto 布局文件里面的相册id
/**
* 弹出popupWindow更改头像
*/
private void changeIcon() {
popupView = View.inflate(this, R.layout.item_change_icon, null);
// 参数2,3:指明popupwindow的宽度和高度
popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
//popup显示和消失的动画
popupWindow.setAnimationStyle(R.style.PopupWindow);
// 设置背景图片, 必须设置,不然动画没作用
popupWindow.setBackgroundDrawable(new BitmapDrawable());
popupWindow.setFocusable(true);
// 设置点击popupwindow外屏幕其它地方消失
popupWindow.setOutsideTouchable(true);
popupView.findViewById(R.id.tvTakePhoto).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 打开系统拍照程
goCamera();
popupWindow.dismiss();
lighton();
}
});
popupView.findViewById(R.id.tvSelectPhoto).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 打开系统图库选择图片
goPhotoAlbum();
popupWindow.dismiss();
lighton();
}
});
// 在点击之后设置popupwindow的销毁
if (popupWindow.isShowing()) {
popupWindow.dismiss();
lighton();
}
// 设置popupWindow的显示位置,此处是在手机屏幕底部且水平居中的位置
popupWindow.showAtLocation(PersonalDataActivity.this.findViewById(R.id.setting), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
lighton();
}
});
}
接下来这两个是设置手机亮度的 不想要可以不要貌似没什么影响
/**
* 设置手机屏幕亮度变暗
*/
public void lightoff() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 0.3f;
getWindow().setAttributes(lp);
}
/**
* 设置手机屏幕亮度显示正常
*/
public void lighton() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1f;
getWindow().setAttributes(lp);
}
接下来是调用相机相册的方法 之所以没有用我之前提出的调用相机相册的方法是因为 我需要上传图片那个返回的是uri和bitmap 我转换了貌似上传失败了 而且那个界面也不怎么好看 就放弃了 但是那个加了裁剪 这个没有
//激活相机操作
private void goCamera() {
//这个是拍照后储存的位置 所以要放在方法里面 有的界面需要多次拍照 不能全存在一个位置 会保存不上
cameraSavePath = new File(Environment.getExternalStorageDirectory().getPath() + "/" + System.currentTimeMillis() + ".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(PersonalDataActivity.this, "com.iimpath.www.fileprovider", cameraSavePath);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
uri = Uri.fromFile(cameraSavePath);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
PersonalDataActivity.this.startActivityForResult(intent, 1);
}
//激活相册操作
private void goPhotoAlbum() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 2);
}
然后是调用相机相册的回调
/*
* 调用相机相册的回调
* */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == 1) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
photoPath = String.valueOf(cameraSavePath);
} else {
photoPath = uri.getEncodedPath();
}
//上传图片
initSetPhone();
} else {
photoPath = getPhotoFromPhotoAlbum.getRealPathFromUri(this, data.getData());
//上传图片
initSetPhone();
}
}
}
后边基本就是上传操作了 恩 分开写吧 需要的请看下一篇 写的不怎么仔细 如果大家用到后有哪里报错可以找我哦