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("获取照片失败");        }    }}

最终实现的结果

Android调用相机和相册详解_第1张图片)
Android调用相机和相册详解_第2张图片
Android调用相机和相册详解_第3张图片

啦啦啦 更换成功啦

更多相关文章

  1. Android分享图片
  2. android JNI处理图片的例子
  3. Android 自定义相机
  4. Android仿微信朋友圈发图片和文字
  5. Android根据电量变化为不同图片的方法【电池电量提示】
  6. Android 图片旋转(使用Matrix.setRotate方法)
  7. [置顶] android调用系统相机拍照并保存在本地
  8. Android之关于手势操作图片的缩放与移动
  9. Android的TextView使用Html来处理图片显示、字体样式、超链接等

随机推荐

  1. NDK编译Android动态链接库
  2. Android 检测网络是否打开
  3. Android异步加载图像(含线程池,缓存方法)
  4. Android控件之ImageView,Button, ImageBut
  5. GestureDetector 和SimpleOnGestureListe
  6. 【Android】android使用Leaks检测内存泄
  7. ant编译android工程用批处理打包
  8. android Json解析——揭开json解析的神秘
  9. 解决android sdk中找不到tools目录Androi
  10. android 开发小记