Android开发实现用户头像更换

 

Android开发实现用户头像更换

标签: android开发头像更换
  1943人阅读  评论(0)  收藏  举报
  分类:
AS Android开发之功能实现(8) 


1. 首先是布局文件,这里简单放置两个Button和一个ImageView就可以了

[html]  view plain  copy
 print ?
  1. xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical"  
  7.     tools:context=".MainActivity">  
  8.   
  9.     <ImageView  
  10.         android:id="@+id/iv_head"  
  11.         android:layout_width="150dp"  
  12.         android:layout_height="150dp"  
  13.         android:layout_gravity="center_horizontal"  
  14.         android:src="@drawable/ic_launcher" />  
  15.   
  16.     <Button  
  17.         android:id="@+id/btn_takephoto"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:text="拍照" />  
  21.   
  22.     <Button  
  23.         android:id="@+id/btn_photos"  
  24.         android:layout_width="wrap_content"  
  25.         android:layout_height="wrap_content"  
  26.         android:text="从相册中选取" />  
  27. LinearLayout>  

2.下面是实现的Java代码

[java]  view plain  copy
 print ?
  1. import java.io.File;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5.   
  6. import android.net.Uri;  
  7. import android.os.Bundle;  
  8. import android.os.Environment;  
  9. import android.provider.MediaStore;  
  10. import android.app.Activity;  
  11. import android.content.Intent;  
  12. import android.graphics.Bitmap;  
  13. import android.graphics.BitmapFactory;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.ImageView;  
  18. import android.widget.Toast;  
  19.   
  20. public class MainActivity extends Activity implements OnClickListener {  
  21.     private ImageView ivHead;//头像显示  
  22.     private Button btnTakephoto;//拍照  
  23.     private Button btnPhotos;//相册  
  24.     private Bitmap head;//头像Bitmap  
  25.     private static String path = "/sdcard/DemoHead/";//sd路径  
  26.     //(/sdcard/  目录怎么感觉跟Environment.getExternalStorageDirectory()得到的目录是一个效果?)  
  27.   
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.         initView();  
  33.     }  
  34.   
  35.     private void initView() {  
  36.         //初始化控件  
  37.         btnPhotos = (Button) findViewById(R.id.btn_photos);  
  38.         btnTakephoto = (Button) findViewById(R.id.btn_takephoto);  
  39.         btnPhotos.setOnClickListener(this);  
  40.         btnTakephoto.setOnClickListener(this);  
  41.         ivHead = (ImageView) findViewById(R.id.iv_head);  
  42.           
  43.         Bitmap bt = BitmapFactory.decodeFile(path + "head.jpg");//从Sd中找头像,转换成Bitmap  
  44.         if (bt != null) {  
  45.             //如果本地有头像图片的话  
  46.             ivHead.setImageBitmap(bt);  
  47.         } else {  
  48.             //如果本地没有头像图片则从服务器取头像,然后保存在SD卡中,本Demo的网络请求头像部分忽略  
  49.               
  50.         }  
  51.     }  
  52.   
  53.     @Override  
  54.     public void onClick(View v) {  
  55.         switch (v.getId()) {  
  56.             case R.id.btn_photos://从相册里面取照片  
  57.                 Intent intent1 = new Intent(Intent.ACTION_PICK, null);//返回被选中项的URI  
  58.                 intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");//得到所有图片的URI  
  59. //                System.out.println("MediaStore.Images.Media.EXTERNAL_CONTENT_URI  ------------>   "  
  60. //                        + MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//   content://media/external/images/media  
  61.                 startActivityForResult(intent1, 1);  
  62.                 break;  
  63.             case R.id.btn_takephoto://调用相机拍照  
  64.                 //最好用try/catch包裹一下,防止因为用户未给应用程序开启相机权限,而使程序崩溃  
  65.                 try {  
  66.                     Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//开启相机应用程序获取并返回图片(capture:俘获)  
  67.                     intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),  
  68.                             "head.jpg")));//指明存储图片或视频的地址URI  
  69.                     startActivityForResult(intent2, 2);//采用ForResult打开  
  70.                 } catch (Exception e) {  
  71.                     Toast.makeText(MainActivity.this"相机无法启动,请先开启相机权限", Toast.LENGTH_LONG).show();  
  72.                 }  
  73.                 break;  
  74.             default:  
  75.                 break;  
  76.         }  
  77.     }  
  78.   
  79.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  80.         switch (requestCode) {  
  81.             //从相册里面取相片的返回结果  
  82.             case 1:  
  83.                 if (resultCode == RESULT_OK) {  
  84.                     cropPhoto(data.getData());//裁剪图片  
  85.                 }  
  86.   
  87.                 break;  
  88.             //相机拍照后的返回结果  
  89.             case 2:  
  90.                 if (resultCode == RESULT_OK) {  
  91.                     File temp = new File(Environment.getExternalStorageDirectory()  
  92.                             + "/head.jpg");  
  93.                     cropPhoto(Uri.fromFile(temp));//裁剪图片  
  94.                 }  
  95.   
  96.                 break;  
  97.             //调用系统裁剪图片后  
  98.             case 3:  
  99.                 if (data != null) {  
  100.                     Bundle extras = data.getExtras();  
  101.                     head = extras.getParcelable("data");  
  102.                     if (head != null) {  
  103.                         /**  
  104.                          * 上传服务器代码  
  105.                          */  
  106.                         setPicToView(head);//保存在SD卡中  
  107.                         ivHead.setImageBitmap(head);//用ImageView显示出来  
  108.                     }  
  109.                 }  
  110.                 break;  
  111.             default:  
  112.                 break;  
  113.   
  114.         }  
  115.         super.onActivityResult(requestCode, resultCode, data);  
  116.     }  
  117.   
  118.     ;  
  119.   
  120.     /** 
  121.      * 调用系统的裁剪 
  122.      * 
  123.      * @param uri 
  124.      */  
  125.     public void cropPhoto(Uri uri) {  
  126.         Intent intent = new Intent("com.android.camera.action.CROP");  
  127.         //找到指定URI对应的资源图片  
  128.         intent.setDataAndType(uri, "image/*");  
  129.         intent.putExtra("crop""true");  
  130.         // aspectX aspectY 是宽高的比例  
  131.         intent.putExtra("aspectX"1);  
  132.         intent.putExtra("aspectY"1);  
  133.         // outputX outputY 是裁剪图片宽高  
  134.         intent.putExtra("outputX"150);  
  135.         intent.putExtra("outputY"150);  
  136.         intent.putExtra("return-data"true);  
  137.         //进入系统裁剪图片的界面  
  138.         startActivityForResult(intent, 3);  
  139.     }  
  140.   
  141.     private void setPicToView(Bitmap mBitmap) {  
  142.         String sdStatus = Environment.getExternalStorageState();  
  143.         if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd卡是否可用  
  144.             return;  
  145.         }  
  146.         FileOutputStream b = null;  
  147.         File file = new File(path);  
  148.         file.mkdirs();// 创建以此File对象为名(path)的文件夹  
  149.         String fileName = path + "head.jpg";//图片名字  
  150.         try {  
  151.             b = new FileOutputStream(fileName);  
  152.             mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件(compress:压缩)  
  153.   
  154.         } catch (FileNotFoundException e) {  
  155.             e.printStackTrace();  
  156.         } finally {  
  157.             try {  
  158.                 //关闭流  
  159.                 b.flush();  
  160.                 b.close();  
  161.             } catch (IOException e) {  
  162.                 e.printStackTrace();  
  163.             }  
  164.   
  165.         }  
  166.     }  
  167. }  

3.最后别忘了添加相机、读写SD卡的权限

[html]  view plain  copy
 print ?
  1. <uses-permission android:name="android.permission.CAMERA" />  
  2. <uses-feature android:name="android.hardware.camera"/>  
  3. <uses-feature android:name="android.hardware.camera.autofocus"/>  
  4.   
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  6. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  


这样就OK了!

你可能感兴趣的:(Android开发实现用户头像更换)