Android 相册和拍照设置头像功能
来源:互联网 发布:哪个yy协议软件好 编辑:程序博客网 时间:2024/05/09 00:34
前言 : 现在已经管不了我的名字到底干净不干净…坏蛋也好,什么都好,反正我要我的名字轰动全世界!!!
基础讲解
一般而言,使用拍照和裁剪功能基本上都是使用系统自带的Intent来实现,我们要将别人写好的Intent,那肯定要使用隐式Intent的方式来启用了.
拍照 : Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定调用相机拍照后照片的储存路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(TEMP_DIR, imageName)));裁剪 : Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
剪切完成后的图片会设置一些属性
Exta Options Table for image/* crop:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
所需权限
代码讲解
布局比较简单就只有一个ImageView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.shao.cemerademo.MainActivity" > <ImageView android:id="@+id/imageview" android:layout_width="64dp" android:layout_height="64dp" android:src="@drawable/ic_launcher" /></RelativeLayout>
1.点击图片
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.imageview); iv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showMyDialog("相册", "拍照", SET_AVATAR); } }); }
2.弹出Dialog对话框选择相册还是拍照
// dialog---点击前往相册或者调用照相机,裁剪图片返回一个头像图片 private void showMyDialog(String title1, String titel2, final int Type) { final AlertDialog dlg = new AlertDialog.Builder(this).create(); dlg.show(); Window window = dlg.getWindow(); // *** 主要就是在这里实现这种效果的. // 设置窗口的内容页面,fy_dialog_alert.xml文件中定义view内容 window.setContentView(R.layout.fy_dialog_alert); // 为确认按钮添加事件,执行操作 final TextView tv_content1 = (TextView) window .findViewById(R.id.tv_content1); tv_content1.setText(title1); tv_content1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (Type == SET_AVATAR) { getImage(PHOTO_REQUEST_GALLERY); } dlg.cancel(); } }); final TextView tv_content2 = (TextView) window .findViewById(R.id.tv_content2); tv_content2.setText(titel2); tv_content2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (Type == SET_AVATAR) { getImage(PHOTO_REQUEST_TAKEPHOTO); } dlg.cancel(); } }); }
3.无论是相册还是拍照,都是调用getImage()这个方法
private void getImage(int type) { // 无论是相册还是拍照,先把预定的文件名确定好 getImageName(); if (!checkDir()) { Toast.makeText(getApplicationContext(), "找不到存储卡...", Toast.LENGTH_LONG).show(); return; } if (type == PHOTO_REQUEST_TAKEPHOTO) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定调用相机拍照后照片的储存路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(TEMP_DIR, imageName))); startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO); return; } if (type == PHOTO_REQUEST_GALLERY) { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intent, PHOTO_REQUEST_GALLERY); return; } }其中有些方法做些简单的说明给图片命名
private String getImageName() { // 用一个全局变量保存当前图片的文件名 imageName = getNowTime() + ".PNG"; return imageName;}
// 以当前时间作为图片的文件名,精确到秒 private String getNowTime() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmssSS", Locale.getDefault()); return dateFormat.format(date); } // 检查目录 private boolean checkDir() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { File dir = new File(TEMP_DIR); if (!dir.exists()) { dir.mkdirs(); } return true; } else { return false; } }
4,启动照相或者相册之后,onActivityResult处理返回值
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case PHOTO_REQUEST_TAKEPHOTO: startPhotoZoom(Uri.fromFile(new File(TEMP_DIR, imageName)), 240); break; case PHOTO_REQUEST_GALLERY: if (data != null) startPhotoZoom(data.getData(), 240); break; case PHOTO_REQUEST_CUT: // 至此已经得到一个头像的图片,先在本地更新 File file = new File(TEMP_DIR, imageName); bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); if (bitmap == null) { Bundle extra = data.getExtras(); if (extra != null) { bitmap = (Bitmap)extra.get("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); iv.setImageBitmap(bitmap); } } break; } } } private void startPhotoZoom(Uri uri1, int size) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri1, "image/*"); // crop为true是设置在开启的intent中设置显示的view可以剪裁 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX,outputY 是剪裁图片的宽高 intent.putExtra("outputX", size); intent.putExtra("outputY", size); intent.putExtra("return-data", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(TEMP_DIR, imageName))); intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG); intent.putExtra("noFaceDetection", true); // no face detection startActivityForResult(intent, PHOTO_REQUEST_CUT); }
return-data:是将结果保存在data中返回,在onActivityResult中,直接调用intent.getdata()就可以获取值了,这里设为true,就是让它保存在data中。
源码
2 0
- Android 相册和拍照设置头像功能
- Android 拍照或从相册设置头像
- Android 头像(拍照,相册)选择后裁剪功能
- Android自定义dialog——设置头像(拍照,相册)
- Android 项目更换头像(拍照和选择相册)
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- android选择系统相机拍照和系统相册,裁剪图片并保存和设置头像,适配至7.0
- android头像选择(拍照,相册,裁剪)
- android头像选择(拍照,相册,裁剪)
- Android 上传头像的拍照跟相册
- Android打开系统拍照&相册获取头像
- 上传头像 拍照 相册
- mui 拍照和相册 功能
- Cocos2d-x 3.x 头像选择器,本地相册与拍照+头像编辑功能(Android、IOS双平台实现)
- Android开发之裁切(拍照+相册)图像并设置头像小结
- IO技术(七)Properties、文件切割合并的初步改进
- 解忧杂货店 --- 东野圭吾
- 12个Linux进程管理命令介绍
- hibernate工具类
- 树状数组+dfs(hdu 5877)
- Android 相册和拍照设置头像功能
- NYOJ-467-中缀式变后缀式(模拟)
- IO技术(八)把对象存储到持久化设备中
- python中SQLite 和PySQLite的安装使用
- 【31.42%】【CF 714A】Meeting of Old Friends
- win7无法打开共享文件夹的文件
- object detection(物体检测)系列论文梳理
- Hbase增删改查、关联查询、关系型数据库转化
- 【软件工程】——开发模型