调用手机相机相册

项目中用到更换头像和认证的功能 所以就写了这个 希望能帮到大家

由于本人技术比较差 写过的有些细节都忘得差不多了 有错希望可以提出

先放效果图给你们看看

首先呢 貌似用到了这两个权限。。貌似是因为我也记不清了 当时尝试了好几种方法 可能会有点乱 但是不会炸 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();
            }
        }
    }

后边基本就是上传操作了 恩 分开写吧 需要的请看下一篇 写的不怎么仔细 如果大家用到后有哪里报错可以找我哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值