Android调用相机和相册详解

主要是想实现头像的更改

xml内容

我用的是XUI的自定义控件 gradient_background是自定义的渐变背景色

<?xml version="1.0" encoding="utf-8"?>                    

gradient_background.xml内容如下,渐变色背景

<?xml version="1.0" encoding="utf-8"?>        

实现的页面效果如下

activity部分

package cn.lision.mas.activity.mine;import android.Manifest;import android.annotation.TargetApi;import android.content.ContentUris;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.provider.DocumentsContract;import android.provider.MediaStore;import android.view.View;import com.xuexiang.xui.widget.actionbar.TitleBar;import com.xuexiang.xui.widget.dialog.bottomsheet.BottomSheet;import com.xuexiang.xui.widget.imageview.RadiusImageView;import com.xuexiang.xutil.tip.ToastUtils;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import androidx.core.content.FileProvider;import cn.lision.mas.R;import cn.lision.mas.base.BaseActivity;/** * 头像更换 */public class HeadChangeActivity extends BaseActivity {    private Context context;    private RadiusImageView headImage;    private Uri imageUri;    public static final int TAKE_PHOTO = 1;    public static final int CHOOSE_PHOTO = 2;    private String orientation = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_head_change);        context = this;        TitleBar titleBar = initTitle("更换头像");        initViews();    }    @Override    public void initViews() {        headImage = (RadiusImageView) findViewById(R.id.headImage);        headImage.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                showSimpleBottomSheetList();            }        });    }    private void showSimpleBottomSheetList() {        new BottomSheet.BottomListSheetBuilder(context)                .addItem("从相册选择图片")                .addItem("拍照")                .addItem("取消")                .setIsCenter(true)                .setOnSheetItemClickListener(new BottomSheet.BottomListSheetBuilder.OnSheetItemClickListener() {                    @Override                    public void onClick(BottomSheet dialog, View itemView, int position, String tag) {                        dialog.dismiss();                        if (position == 0) {                            if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {                                ActivityCompat.requestPermissions(HeadChangeActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);                            } else {                                goPhotoAlbum();                            }                        } else if (position == 1) {                            File file = new File(getExternalCacheDir(), "output_image.jpg");                            try {                                if (file.exists()) {                                    file.delete();                                }                                file.createNewFile();                            } catch (IOException e) {                                e.printStackTrace();                            }                            if (Build.VERSION.SDK_INT >= 24) {                                imageUri = FileProvider.getUriForFile(HeadChangeActivity.this, "com.example.cameraalbumtest.fileprovider", file);                            } else {                                imageUri = Uri.fromFile(file);                            }                            if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {                                ActivityCompat.requestPermissions(HeadChangeActivity.this, new String[]{Manifest.permission.CAMERA}, 1);                            } else {                                callCamera();                            }                        } else {                            dialog.dismiss();                        }                    }                })                .build()                .show();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        switch (requestCode) {            case TAKE_PHOTO:                if (resultCode == RESULT_OK) {                    try {                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));                        headImage.setImageBitmap(bitmap);                    } catch (FileNotFoundException e) {                        e.printStackTrace();                    }                }                break;            case CHOOSE_PHOTO:                if (resultCode == RESULT_OK) {                    //判断手机系统版本号                    if (Build.VERSION.SDK_INT >= 19) {                        //4.4及以上系统使用                        handleImageOnKitKat(data);                    } else {                        handleImageBeforeKitKat(data);                    }                }                break;            default:                break;        }    }    //激活相册操作    private void goPhotoAlbum() {        Intent intent = new Intent("android.intent.action.GET_CONTENT");        intent.setType("image/*");        startActivityForResult(intent, CHOOSE_PHOTO);    }    //打开相机    private void callCamera() {        //启动相机权限        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);        startActivityForResult(intent, TAKE_PHOTO);    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        switch (requestCode) {            //打开相册            case CHOOSE_PHOTO:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    goPhotoAlbum();                } else {                    ToastUtils.toast("您没有打开相册的权限");                }                break;            //相机的权限            case TAKE_PHOTO:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    callCamera();                } else {                    ToastUtils.toast("您没有打开相机的权限");                }                break;            default:                break;        }    }    @TargetApi(19)    private void handleImageOnKitKat(Intent data) {        String imagePath = null;        Uri uri = data.getData();        if (DocumentsContract.isDocumentUri(this, uri)) {            String docId = DocumentsContract.getDocumentId(uri);            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {                String id = docId.split(":")[1];                String selection = MediaStore.Images.Media._ID + "=" + id;                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));                imagePath = getImagePath(contentUri, null);            }        } else if ("content".equalsIgnoreCase(uri.getScheme())) {            //如果是content类型的Uri,则使用普通方式处理            imagePath = getImagePath(uri, null);        } else if ("file".equalsIgnoreCase(uri.getScheme())) {            imagePath = uri.getPath();        }        dispalyImage(imagePath);    }    private void handleImageBeforeKitKat(Intent data) {        Uri uri = data.getData();        String imagePath = getImagePath(uri, null);        dispalyImage(imagePath);    }    private String getImagePath(Uri uri, String selection) {        String path = null;        //通过uri和selection来获取真实的图片路径        Cursor cursor = getContentResolver().query(uri, null, selection, null, null);        if (cursor != null) {            if (cursor.moveToFirst()) {                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));            }            orientation = cursor.getString(cursor.getColumnIndex("orientation"));// 获取旋转的角度            cursor.close();        }        return path;    }    private void dispalyImage(String imagePath) {        if (imagePath != null) {            //根据path读取资源路径            Bitmap bitmap = BitmapFactory.decodeFile(imagePath);            int angle = 0;            if (orientation != null && !"".equals(orientation)) {                angle = Integer.parseInt(orientation);            }            if (angle != 0) {                // 下面的方法主要作用是把图片转一个角度,也可以放大缩小等                Matrix m = new Matrix();                int width = bitmap.getWidth();                int height = bitmap.getHeight();                m.setRotate(angle); // 旋转angle度                bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true);// 从新生成图片            }            headImage.setImageBitmap(bitmap);        } else {            ToastUtils.toast("获取照片失败");        }    }}

最终实现的结果

)

啦啦啦 更换成功啦

更多相关文章

  1. 《android关于WIFI的操作》
  2. Android之零碎记忆点
  3. Android(安卓)自定义相机
  4. 赋予应用权限
  5. Java.lang.ClassNotFound Instrumentation 测试异常
  6. android 打开通知栏
  7. [置顶] android调用系统相机拍照并保存在本地
  8. android 语音识别
  9. [Android] 监听系统网络连接打开或者关闭的消息

随机推荐

  1. JSON的使用以及传统XHR, Fetch, async, a
  2. JS经典轮播图和选项卡
  3. MyCms 开源自媒体系统后台 角色管理&管理
  4. 怎样学习素描绘画?零基础学绘画素描教程
  5. 选项卡,轮播图
  6. 如何用虚拟主机搭建一个博客/blog?
  7. 使用阿里巴巴开源镜像站镜像——Kubernet
  8. docker中实现安装php拓展步骤讲解
  9. javascript选项卡,轮播图与购物车的实现
  10. CSS:层叠样式表