android 头像选择以及裁剪
一、布局申明
<ImageView
android:id="@+id/head_image"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_centerHorizontal="true"
android:background="@drawable/default_avatar" />
二、Activity中代码
private ImageView headImageView; private BitmapUtil bitmapUtil = new BitmapUtil(this);
private File headFile; headImageView = (ImageView) findViewById(R.id.head_image); headImageView.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { new android.app.AlertDialog.Builder(RegisterActivity.this)
.setTitle("头像选择")
.setNegativeButton("相册选取",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
bitmapUtil.doCropPhoto(RegisterActivity.this);
}
})
.setPositiveButton("相机拍照",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有SD卡
bitmapUtil.doTakePhoto(RegisterActivity.this);// 用户点击了从照相机获取
}
}
}).show();
}
});
三、Activity回调方法
/**
* 头像选择回调
* resultCode: 正常返回-1 用户后退返回0
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("TAG", requestCode + " : " + resultCode);
if(resultCode == RESULT_OK) {
switch (requestCode) { case BitmapUtil.activity_result_camara_with_data: // 拍照
try {
if (bitmapUtil.tempFile != null) {
bitmapUtil.cropImageByCamera();
}
} catch (Exception e) {
e.printStackTrace();
}
break;
case BitmapUtil.activity_result_cropimage_with_data:
try {
if (bitmapUtil.tempFile != null) {
headFile = bitmapUtil.tempFile; Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(headFile));
headImageView.setImageBitmap(bitmap);
}
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
四、工具类
public class BitmapUtil {
    public final static int activity_result_camara_with_data = 1006;
    public final static int activity_result_cropimage_with_data = 1007;
    public File tempFile;
    private Activity activity;
    public BitmapUtil(Activity activity) {
        super();
        this.activity = activity;
    }
    /**
     * 照相获取图片
     */
    public void selectPicFromCamera() {
//        if (!CommonUtils.isExitsSdcard()) {
//            Toast.makeText(activity, "SD卡不存在,不能拍照", Toast.LENGTH_SHORT).show();
//            return;
//        }
        if(createNewFile()) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
            activity.startActivityForResult(intent, activity_result_camara_with_data);
        }
    }
    /**
     * 照相获取完成图片时候裁剪图片
     */
    public void cropImageByCamera() {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(Uri.fromFile(tempFile), "image/*");
        buildCropIntent(intent);
        activity.startActivityForResult(intent, activity_result_cropimage_with_data);
    }
    /**
     * 从图库获取图片
     */
    public void selectPicFromLocal() {
        Intent intent;
        if (Build.VERSION.SDK_INT < 19) {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
        } else {
            intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        }
        if(createNewFile()) {
            buildCropIntent(intent);
            activity.startActivityForResult(intent, activity_result_cropimage_with_data);
        }
    }
    /**
     * 构建截图的intent
     * @param intent
     */
    private void buildCropIntent(Intent intent) {
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 100);
        intent.putExtra("outputY", 100);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", false); // no face detection
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
    }
    /**
     * 创建新文件
     * @return
     */
    private boolean createNewFile() {
        if (!CommonUtils.isExitsSdcard()) {
            Toast.makeText(activity, "SD卡不存在", Toast.LENGTH_SHORT).show();
            return false;
        }
        tempFile = new File(Environment.getExternalStorageDirectory().getPath() + "/stchat" + "/images/" + System.currentTimeMillis() + ".jpg");
        if(!tempFile.getParentFile().exists()) {
            tempFile.getParentFile().mkdirs();
        }
        if(!tempFile.exists()) {
            try {
                tempFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }
    public static void setBitmap(ImageView view, String head_portrait) {
        // 设置用户头像
        Bitmap bitmap = BitmapFactory.decodeFile(head_portrait);
        if(bitmap != null) {
            view.setImageBitmap(bitmap);
        }
    }
}
android 头像选择以及裁剪的更多相关文章
- android头像选择(拍照,相册,裁剪)
		
组织头像上传时候,不兼容android6.0,并且 imageview.setImageBitmap(BitmapFactory.decodeFile(IMAGE_FILE_LOCATION));// ...
 - Jcrop+uploadify+php实现上传头像预览裁剪
		
最近由于项目需要,所以做了一个上传头像预览并且可以预览裁剪的功能,大概思路是上传的图片先保存到服务器,然后通过ajax从服务器获取到图片信息,再利用Jcrop插件进行裁剪,之后通过PHP获取到的四个裁 ...
 - Android第三方开源图片裁剪截取:cropper
		
 Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...
 - 选择Android还是选择JavaEE?
		
很多同学咨询过同样的一个问题,该问题也是最备受争议的问题,那就是到底是选择Android还是选择JavaEE.下面发表一些本人的看法. Android属于一个特有的Java技术应用,专注于 ...
 - android单选按钮选择,RadioGroup,radioButton
		
android单选按钮选择,RadioGroup,radioButton 14. 四 / android基础 / 没有评论 单选布局绑定 如何识别选择
 - Android研究之为基于 x86 的 Android* 游戏选择合适的引擎具体解释
		
 摘要 游戏开发者知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中.它们所占的比例超过 90% ...
 - MTK Android 设置-选择日期格式 [管理和组织首选项,ListPreference,CheckBoxPreference,EditTextPreference,RingtonePreference]
		
###android.preference.ListPreference的一些特性 android:key 选项的名称或键 android:title 选项的标题 android:summary ...
 - android选择和裁剪图像拍摄的图像
		
转载请注明出处:http://blog.csdn.net/allen315410/article/details/39994913 近期从曾经的项目中扒下来一个经常使用的模块.在这里有必要记录一下的. ...
 - Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码
		
Android项目开发中经常会遇见需要实现圆角或者圆形的图片功能,如果仅仅使用系统自带的ImageView控件显然无法实现此功能,所以通过系列文章的形式由简到繁全方位的介绍一下此功能的实现,巩固一下自 ...
 
随机推荐
- 手机网站Meta的使用
			
meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称/值对. ...
 - maven-dependencyManagement和dependencies区别
			
在多模块的maven项目中,如果各个子项目的依赖包相同但版本不同的话,对于测试.发布和管理非常困难 dependencyManagement就是起统一版本作用的一个标签,好处有2,一是统一版本,二是子 ...
 - NodeJS学习笔记之Connect中间件应用实例
			
一,开篇分析 大家好哦,大熊君又来了,昨天因为有点个人的事没有写博客,今天又出来了一篇,这篇主要是写一个记事本的小应用,前面的文章, 我也介绍过“Connect”中间件的使用以及“Mongodb”的用 ...
 - tushare使用教程:初始化调用PRO版数据示例
			
下面介绍两种常用的数据调取方式: 通过tushare python包 使用http协议直接获取 注:pro版数据接口采用语言无关的http协议实现,但也提供了多种语言的SDK数据获取. 前提条件 1. ...
 - MD5/SHA1/Hmac_SHA1
			
1.MD5 #import <CommonCrypto/CommonDigest.h> + (NSString *) md5:(NSString *) input { const char ...
 - php 查看linux服务器的磁盘使用情况
 - MySQL安装pdf介绍
			
pdf地址:https://files.cnblogs.com/files/pygo/mysql%E5%AE%89%E8%A3%85.pdf
 - Java中的常量池
			
JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...
 - mysql主从同步的键值冲突问题的解决方法
			
转自https://njs375666635.iteye.com/blog/2242067 多主互备和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以设计到自增长重复问题 出现的问题(多主自 ...
 - npm run server报错
			
从git上clone的vue项目npm install后npm run server报错 $ npm run dev > lufei@1.0.0 dev E:\pythonProject\luf ...