运行效果图:点击拍照或者图片库获取头像

但是在anroid4.4版本前后的写法有点不同,可能出现问题。

1、关于拍照调用Intent问题

在4.4版本前可以写成这样:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
activity.startActivityForResult(intent, START_ALBUM_CODE);

或者:

Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
activity.startActivityForResult(intent, START_ALBUM_CODE);

但在4.4版本后就要写成这样了。

Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
activity.startActivityForResult(intent, START_ALBUM_CODE);

2、拍照后保存到sd卡路径问题:

1、保存在sd卡中:sdcard/的路径下
Environment.getExternalStorageDirectory().getAbsolutePath();

2、保存到sd卡下面应用包中:getExternalFilesDir(“/photo”) + “”;这种保存方式可以使卸载应用时,同时也把文件删除,减少sd卡中缓存的垃圾文件。

getExternalFilesDir():一般保存长久文件

getExternalCacheDir():一般保存临时文件

它们的全路径:/storage/emulated/0/Android/data/包名/files/photo

3、头像设置的工作:

  1. 从图片库,或者拍照得到图片;
  2. 图片剪切
  3. 压缩保存图片到本地,并上传服务器
  4. 显示图片时,首先从本地得到。

4、关于图片压缩问题:

bitmap.compress(CompressFormat.JPEG, 70, fos);

0-100.
0 meaning compress for small size,
100 meaning compress for max quality.

quality为图像压缩比的值,0-100.0 意味着小尺寸压缩,100意味着高质量压缩
测试在一张比较小的图片下测试结果:

在保存图片为jpg的情况下:
值 图片大小
0: ——1.34k 图片几乎没办法看,很模糊;
75:——6.67k
100:——24.8k
在保存图片为png的情况下
0: ——–39.38k
75: ——–39.38k
100:—— 39.38k
代码如下:

package com.example.photodemo;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends Activity {private static final int PICK_REQUEST_CODE = 0;private static final int CAMERA_REQUEST_CODE = 1;private static final int ZOOM_REQUEST_CODE = 2;private static final String IMAGE_FILE_NAME = "photo.jpg";private ImageView iv_icon;private String[] items = new String[] { "拍照", "图片库" };public static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv_icon = (ImageView) findViewById(R.id.iv_icon);// 首先判断本地中有没有保存图片:如果没有图片,显示默认图片;File file = getExternalFilesDir("/photo");String url = file + "/icon.png";Bitmap b = BitmapFactory.decodeFile(url);if (b != null) {iv_icon.setImageBitmap(b);}iv_icon.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubshowDialog();}});}private void showDialog() {// TODO Auto-generated method stubnew AlertDialog.Builder(this).setTitle("选择头像").setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubswitch (which) {case 0:if (BitmapUtils.isSdcardExisting()) {Intent intent_camera = new Intent("android.media.action.IMAGE_CAPTURE");intent_camera.putExtra(MediaStore.EXTRA_OUTPUT,getImageUri());intent_camera.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);startActivityForResult(intent_camera,CAMERA_REQUEST_CODE);} else {Toast.makeText(MainActivity.this, "请插入sd卡",Toast.LENGTH_SHORT).show();}break;case 1:Intent intent_gallery = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intent_gallery.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");startActivityForResult(intent_gallery,PICK_REQUEST_CODE);break;}}}).show();}// 在从拍照或者图片啼选择后返回@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode != RESULT_OK) {return;} else {switch (requestCode) {case PICK_REQUEST_CODE:// 从图片啼选择图片后,直接返回的是uri,然后对通过uri取得图片,进行剪切;startPhotoZoom(data.getData());break;case CAMERA_REQUEST_CODE:// 首先判断sd卡是否挂载;if (BitmapUtils.isSdcardExisting()) {startPhotoZoom(getImageUri());} else {Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!",Toast.LENGTH_LONG).show();}break;// 启动剪切图片;case ZOOM_REQUEST_CODE:if (data != null) {showImage(data);}break;}}super.onActivityResult(requestCode, resultCode, data);}// 对图片进行剪切;public void startPhotoZoom(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 150);intent.putExtra("outputY", 150);intent.putExtra("return-data", true);startActivityForResult(intent, ZOOM_REQUEST_CODE);}// 最张显示图片;但是在实际中,在进入activity中要判断sd卡中是否有图片,如果有图片要首先显示图片。// 把图片保存到本地,并且上传给服务器;private void showImage(Intent data) {Bundle extras = data.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");Bitmap photo_round = BitmapUtils.getRoundedCornerBitmap(photo,10.0f);// saveServer();保存到服务器;// saveSD();保存到sd卡;// 显示在界面中;BitmapUtils.saveToSDBitmap(MainActivity.this, "icon.png",photo_round);iv_icon.setImageBitmap(photo_round);}}private Uri getImageUri() {return Uri.fromFile(new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME));}
}

工具类代码

package com.example.photodemo;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.BitmapFactory;
import android.os.Environment;public class BitmapUtils {private static String sdState = Environment.getExternalStorageState();private static String path = Environment.getExternalStorageDirectory().toString();public static final String PHTOT_NAME = "/PHOTO";/*** 把图片保存到sd卡中,保存的路径为storage/PHOTO;* * @param bitmap* @param imageName*/public static void saveBitmap(Bitmap bitmap, String imageName) {File file;File PicName;if (sdState.equals(Environment.MEDIA_MOUNTED)) {// 获得sd卡根目录file = new File(path + PHTOT_NAME);if (!file.exists()) {file.mkdirs();}PicName = new File(file, imageName);try {if (!PicName.exists()) {PicName.createNewFile();}FileOutputStream fos = new FileOutputStream(PicName);if (PicName.getName().endsWith(".png")) {bitmap.compress(CompressFormat.PNG, 70, fos);} else if (PicName.getName().endsWith(".jpg")) {bitmap.compress(CompressFormat.JPEG, 70, fos);}fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}/*** 从sd卡中取出图片;* * @param imageName* @return*/public static Bitmap getBitmap(String imageName) {Bitmap bitmap = null;File imagePic;if (sdState.equals(Environment.MEDIA_MOUNTED)) {imagePic = new File(path + PHTOT_NAME, imageName);if (imagePic.exists()) {try {bitmap = BitmapFactory.decodeStream(new FileInputStream(imagePic));} catch (FileNotFoundException e) {// e.printStackTrace();}}}return bitmap;}/*** 删除sd卡上的图片;* * @param file*/public static void deleteFile(File file) {if (sdState.equals(Environment.MEDIA_MOUNTED)) {if (file.exists()) {if (file.isFile()) {file.delete();}// 如果它是一个目录else if (file.isDirectory()) {// 声明目录下所有的文件 files[];File files[] = file.listFiles();for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件deleteFile(files[i]); // 把每个文件 用这个方法进行迭代}}file.delete();}}}/*** 把文本保存到SDCard/Android/data/你的应用的包名/files/ 目录下,当卸载应用的时候删除;* * @param context* @param fileName* @param text*/public static void savetoSDText(Context context, String fileName,String text) {// TODO Auto-generated method stubFile file = context.getExternalFilesDir("/photo");try {FileOutputStream fos = new FileOutputStream(file + "/" + fileName);fos.write(text.getBytes());fos.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 把图片保存SDCard/Android/data/你的应用的包名/files/ 目录下 当卸载应用的时候删除* * @param context* @param fileName* @param bitmap*/public static void saveToSDBitmap(Context context, String fileName,Bitmap bitmap) {File file = context.getExternalFilesDir("/photo");try {FileOutputStream fos = new FileOutputStream(file + "/" + fileName);bitmap.compress(CompressFormat.PNG, 75, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}/*** 得到圆角图片; bitmap:传入图片 roundPx :传入显示的圆角弧度,一般设置10.0就可以*/private static Bitmap output;public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {if (bitmap != null) {output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),Config.ARGB_8888);Canvas canvas = new Canvas(output);final int color = 0xff424242;final Paint paint = new Paint();final Rect rect = new Rect(0, 0, bitmap.getWidth(),bitmap.getHeight());final RectF rectF = new RectF(rect);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);}return output;}/*** * 判断sd卡是否可用;* * @return*/public static boolean isSdcardExisting() {final String state = Environment.getExternalStorageState();if (state.equals(Environment.MEDIA_MOUNTED)) {return true;} else {return false;}}
}

demo下载地址:http://download.csdn.net/detail/androidxiaogang/9284309

android头像设置相关推荐

  1. Android:设置头像

    该文章讲述了Android原生态开发过程中设置用户原型头像的实现过程.主要使用到技术有:Android原生态开发.CircleImageView圆形图片视图.Crop裁剪工具等. 1.业务介绍 业务具 ...

  2. Android 头像上传的实现

    当我们点击头像想要进行头像上传时,我们可以给上传头像设置一个弹框效果,用来给用户提供相册选择和拍照两种选择. 这时我们可以使用PopupWindow实现 1. 定义图片存储位置 public void ...

  3. Android头像上传实战模拟

    Android头像上传实战模拟 在开发中头像的上传应该是必不可少的,话不多说上效果图! 点击头像弹出PopupWindow分别三个按钮. <?xml version="1.0" ...

  4. Android中设置TextView的颜色setTextColor

    tv.setTextColor(Color.parseColor("#FFFFFF")); tv.setTextColor(Color.WHITE); tv.setTextColo ...

  5. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  6. android studio 设置 ndk 路径

    ndk下载路径: https://developer.android.google.cn/ndk/downloads android studio 设置 ndk 路径 在项目的根目录下面,有个配置文件 ...

  7. android字体行距,android textview设置字体的行距和字间距

    字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView 此属性是使用的是: android.internal. ...

  8. android 自启动列表,Android 机型设置自启动的跳转界面

    Android 机型设置自启动的跳转界面 由于之前版本号把23,6.0误写成26,8.0了,导致一些判断是错的,并且在catch中没有重新对intent更新,导致会有崩溃问题,现已修复. 简书怎么传附 ...

  9. android中设置Animation 动画效果

    在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...

最新文章

  1. 优化系统后VS启动不了问题的一种解决方案
  2. jquery学习(3)--高级选择器
  3. tomcat启动_tomcat学习|tomcat的启动过程
  4. SAP PM单一和复合角色
  5. OpenGL编程指南13:光源移动
  6. Git提交到码云(转)
  7. 理解SpringMVC-------DispatchServlet
  8. 软考信息系统监理师第五次作业
  9. CPU 是如何工作的?
  10. 矩阵论复习笔记:盖尔圆的隔离技巧
  11. 一家中国公司把城市变成了AI版《清明上河图》
  12. css图片滑动切换图_html图片轮播原理
  13. Encountered unexpected token:XXXXX
  14. 学计算机怎能不知道电脑配置
  15. 怒怨与忧虑,微信的双重危机来临!
  16. iOS开发:xcode无法选择设备和corner stone如何过滤上传文件
  17. vivo NEX3史上最强旗舰机!瀑布屏+骁龙855+44W+5G,对战华为
  18. 算法竞赛常用STL库
  19. dbeaver的安装和使用
  20. oracle数据库description,DESCRIPTION=(ADDRESSOracle12c环境下的EM配置和使用方法

热门文章

  1. 爬虫之使用代理ip爬取
  2. strcat、strcpy、strcmp三种函数用法
  3. 青春版网盘:不限度,10GB 空间
  4. ROS学习----依据ROS入门教程,整理的ROS命令
  5. 智能家居 打造一间乐享智能生活的“聪明屋”
  6. 服务器,ping没问题,请求经常超时、时好时坏的解决办法
  7. MYSQL下载安装:
  8. 什么是 UI 自动化测试?
  9. 开发证书与发布证书申请和安装步骤
  10. 量子计算机分解时间,量子计算机如何分解两个质数乘积