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