android 实现APP中改变头像图片的实例代码

具体代码如下所示:

package com.example.studyapplication.fragment;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.text.style.URLSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.studyapplication.MainActivity;
import com.example.studyapplication.R;
import com.example.studyapplication.wode_Activity;
import com.example.studyapplication.zhubanfangActivity;
import com.example.studyapplication.zhuceActivity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.ref.WeakReference;
import static android.app.Activity.RESULT_OK;
public class WodeFragment extends Fragment implements View.OnClickListener {
  private View mView;
  private Context mAvtivity;
  Button youhuiquan;
  Button shoucang;
  Button guanzhu;
  ImageView shezhi;
  ImageView xiaoxi;
  TextView qiehuanweizhuban;
  static  TextView denglu;
  LinearLayout daifukuan;
  LinearLayout daicanyu;
  LinearLayout tuikuan;
  LinearLayout yiwancheng;
  LinearLayout qingxiandenglu;
  LinearLayout log;
  LinearLayout quanbudingdan;
  private Button LL01,LL02,LL03;
  private Context mContext;
  private ImageButton touxiang;
  private Bitmap head;// 头像Bitmap
  private static String path = "/sdcard/myHead/";// sd路径
  Activity mActivity;
  Uri uritempFile;
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.wode_layout, null);
    mActivity=this.getActivity();
    //设置布局文件5888
    return mView;
  }
  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.mContext = getActivity();
  }
    /*
    点击头像进行更换头像
     */
    touxiang.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        switch (v.getId()) {
          case R.id.touxiang:// 更换头像
            showTypeDialog();
            break;
        }
      }
    });
  }
  private void initView() {
    LL01=(Button)getActivity().findViewById(R.id.youhuiquan);
    LL02=(Button) getActivity().findViewById(R.id.shoucang);
    LL03=(Button)getActivity().findViewById(R.id.guanzhu);
    touxiang = (ImageButton)getActivity().findViewById(R.id.touxiang);
    Bitmap bt = BitmapFactory.decodeFile(path + "log.png");// 从SD卡中找头像,转换成Bitmap
    if (bt != null) {
      @SuppressWarnings("deprecation")
      Drawable drawable = new BitmapDrawable(bt);// 转换成drawable
      touxiang.setImageDrawable(drawable);
    } else {
      /**
       * 如果SD里面没有则需要从服务器取头像,取回来的头像再保存在SD中
       *
       */
    }
  }
  private void showTypeDialog() {
    //显示对话框
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    final AlertDialog dialog = builder.create();
    View view = View.inflate(getActivity(), R.layout.dialog_select_photo, null);
    TextView tv_select_gallery = (TextView) view.findViewById(R.id.tv_select_gallery);
    TextView tv_select_camera = (TextView) view.findViewById(R.id.tv_select_camera);
    tv_select_gallery.setOnClickListener(new View.OnClickListener() {// 在相册中选取
      @Override
      public void onClick(View v) {
        Intent intent1 = new Intent(Intent.ACTION_PICK, null);
        //打开文件
        intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/log.png");
        startActivityForResult(intent1, 1);
         dialog.dismiss();
      }
    });
    tv_select_camera.setOnClickListener(new View.OnClickListener() {// 调用照相机
      @Override
      public void onClick(View v) {
        Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent2.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "log.png")));
        startActivityForResult(intent2, 2);// 采用ForResult打开
        dialog.dismiss();
      }
    });
    dialog.setView(view);
    dialog.show();
  }
  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
      case 1:
        if (resultCode == RESULT_OK) {// 如果返回码是可以用的
          cropPhoto(data.getData());// 裁剪图片
        }
        break;
      case 2:
        if (resultCode == RESULT_OK) {
          File temp = new File(Environment.getExternalStorageDirectory() + "/head.jpg");
          cropPhoto(Uri.fromFile(temp));// 裁剪图片
        }
        break;
      case 3:
        if (data != null) {
          Uri extras = data.getData();
          //head = extras.getParcelable("data");
          try {
            head=BitmapFactory.decodeStream(mActivity.getContentResolver().openInputStream(uritempFile));
          } catch (FileNotFoundException e) {
            e.printStackTrace();
          }
          if (head != null) {
            /**
             * 上传服务器代码
             */
            // 让刚才选择裁剪得到的图片显示在界面上
            setPicToView(head);// 保存在SD卡中
            touxiang.setImageBitmap(head);// 用ImageButton显示出来
          }
        }
        break;
      default:
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
  }
  /**
   * 调用系统的裁剪功能
   *
   * @param uri
   */
  public void cropPhoto(Uri uri) {
    if(uri== null){
      Log.i("tag","The uri is not exist.");
    }
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*.png");
    //设置裁剪
    intent.putExtra("crop", "true");
    // aspectX aspectY 是宽高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    // outputX outputY 是裁剪图片宽高
    intent.putExtra("outputX", 250);
    intent.putExtra("outputY", 250);
    intent.putExtra("return-data", true);
    uritempFile = Uri.parse("file:///sdcard/temp.jpg");//重要,android4.0以上,本地地址前都加file://+/
    // uritempFile=uri;
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    startActivityForResult(intent, 3);
  }
  private void setPicToView(Bitmap mBitmap) {
    String sdStatus = Environment.getExternalStorageState();
    if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
      return;
    }
    FileOutputStream b = null;
    File file = new File(path);
    file.mkdirs();// 创建文件夹
    String fileName = path + "log.png";// 图片名字
    try {
      b = new FileOutputStream(fileName);
      mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } finally {
      try {
        // 关闭流
        b.flush();
        b.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
//生成圆角图片-------未使用
  private Bitmap getRoundedCornerBitmap(Bitmap bitmap){
    Bitmap roundBitMap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas =new Canvas(roundBitMap);
    int color=0xff424242;
    Paint paint=new Paint();
    //设置圆形半径
    int radius;
    if( bitmap.getWidth()>bitmap.getHeight()){
      radius=bitmap.getHeight()/2;
    }else {
      radius=bitmap.getWidth()/2;
    }
    //绘制圆形
    paint.setAntiAlias(true);
    canvas.drawARGB(0,0,0,0);
    paint.setColor(color);
    canvas.drawCircle(bitmap.getWidth()/2,bitmap.getHeight()/2,radius,paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap,0,0,paint);
    return roundBitMap;
  }
}

注意:手机权限一定要设置,这个非常重要

AndroidManifest.xml:

 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"  tols:ignore="ProtectedPermissions" />

总结

以上所述是小编给大家介绍的android 实现APP中改变头像图片的实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

时间: 2019-07-01

Android实现从本地图库/相机拍照后裁剪图片并设置头像

玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片.上述过程已经实现好了,最后一步我加上了把截取好的图片在保存到本地的操作,来保存头像.为了大家需要,下面我们小编把完整的代码贴出来供大家参考. 先给大家展示效果图: 代码部分: 布局代码(其实就是两个按钮和一个ImageView来显示头像) <LinearLayout xmlns:android="http://schemas.android.co

Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)

Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像. Problem: 拍好照片,点击裁剪,弹Toast"无法加载此图片". Solution: 在裁剪的class里加两行代码 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 主要代码如下: public static final S

Android实现动态圆环的图片头像控件

先看效果图: 现在大部分的app上难免会使用到圆形头像,所以今天我给大家分享一个单独使用的,并且周围带有圆环动画的花哨圆形头像控件,本控件是在圆形头像控件基础上实现的,只是在其周围再画一些不同大小的圆而已,就可以实现如图的效果. 圆形头像的基本原理是将设置的资源文件转化成Bitmap,然后通过BitmapShader类将Bitmap成为Paint的渲染器,然后在onDraw()中通过canvas.drawCircle(rx,ry,radius,paint);画布上画圆,而这个圆就是形成了圆形头像

Android通过手机拍照或从本地相册选取图片设置头像

像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1.让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2.让用户启动手机的相机拍照,拍完照片后裁剪,然后作为头像. 我现在写一个简单的完整代码例子,说明如何在android中实现上述两个头像设置功能. MainActivity.Java文件: package zhangpgil.photo; import java.io.File; import android.support.v7.app.A

Android个人中心的头像上传,图片编码及截取实例

首先需要有网络权限,然后我们这里匹配的网络请求是之前封装好的Okhttp. 非常的简单方便,直接复制进去,依赖一下包,然后调用方法即可. 这里是把图片转换成Base64.decode(imageString, Base64.DEFAULT); 转成Base64编码上传.具体内容也不少,需要完全整明白,还是要花点时间慢慢看的. 先看看简单的效果图: 那么万事具备,只欠东风了.直接上代码: public class MainActivity extends AppCompatActivity imp

Android 自定义圆形头像CircleImageView支持加载网络图片的实现代码

在Android开发中我们常常用到圆形的头像,如果每次加载之后再进行圆形裁剪特别麻烦.所以在这里写一个自定义圆形ImageView,直接去加载网络图片,这样的话就特别的方便. 先上效果图 主要的方法 1.让自定义 CircleImageView 继承ImageView /** * 自定义圆形头像 * Created by Dylan on 2015/11/26 0026. */ public class CircleImageView extends ImageView { } 2.在构造方法中

Android实现本地上传图片并设置为圆形头像

先从本地把图片上传到服务器,然后根据URL把头像处理成圆形头像. 因为上传图片用到bmob的平台,所以要到bmob(http://www.bmob.cn)申请密钥. 效果图: 核心代码: 复制代码 代码如下: public class MainActivity extends Activity {         private ImageView iv;         private String appKey="";                //填写你的Applicatio

Android 编辑头像功能简单实现实例(图片选取,裁剪)

本文介绍了Android 编辑头像功能的简单实例,可以实现拍照,图片选取,裁剪. 拍照 public static void startCamera(Fragment fragment){ File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+ File.separator+"user_icon.jpg"); Intent intent=new Inten

Android手机拍照或选取图库图片作为头像

package zhangpgil.photo; import java.io.File; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import android.content.Intent; import

Android部分手机拍照后获取的图片被旋转问题的解决方法

调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的.其它品牌的手机都是正常的,就三星出现这个怪事. 在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊! 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了. 具体思路: 1.首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个

Android实现拍照、选择相册图片并裁剪功能

通过拍照或相册中获取图片,并进行裁剪操作,然后把图片显示到ImageView上.  当然也可以上传到服务器(项目中绝大部分情况是上传到服务器),参考网上资料及结合项目实际情况,  测试了多款手机暂时没有发现严重问题.代码有注释,直接贴代码: public class UploadPicActivity extends Activity implements View.OnClickListener { private Button take_photo_btn; private Button s

android系统拍照结合android-crop裁剪图片

在一个应用中更换用户的头像,一般有拍照和从图库中选择照片两种方法,现在网上也有很多开源的,但是很多都太复杂.而 Android-crop 这个库比较小,代码不复杂,比较适合,但是它没有拍照这个功能,需要我们自己整合进去. 调用系统相机拍照 1.返回略缩图的拍照 // 调用系统的拍照 private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAP

Android实现拍照截取和相册图片截取

关于拍照截取和相册截取,看了网上很多资料,自己整理了一份比较详细的,供有需要的人参考 1  拍照 原理就是通过intent调用系统的相机,拍完照在回调进行操作,成功获取到拍完照的图片根据uri调用系统的裁剪页面,裁剪完也是在回调中进行处理,显示在页面的imageview中. 2  相册选取图片 原理也是通过intent打开系统的图片,用户选择完成以后在回调中根据图片的uri调用系统的裁剪页面,同上. 首先,定义几个常量 public static final int TAKE_PHOTO = 1

Android实现手机拍照功能

本文实例为大家讲解如何轻松实现Android手机拍照功能,分享给大家供大家参考.具体如下: 一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"

HTML5+Canvas调用手机拍照功能实现图片上传(上)

因为最近一段时间,一直在弄微信项目,其中涉及到了证件上传的功能,刚开始的时候一点头绪都没有,上网查了很多资料,QQ群里面也问了不少人,很多人说如果是app程序,可以申请系统权限,然后再去调用系统底层的东西,但是微信是在浏览器里面操作的,我们自定义的页面也是通过微信内置浏览器打开的,而且微信浏览器在内部进行了很多特殊处理,屏蔽了很多东西,所以要在页面调用拍照功能或者是打开手机系统的图库目录是不可能的,当然,这些都只是大伙儿理论上的猜测而已,而在我查了两天的资料之后,发现这个问题原来是可以解决的,而

Android实现拍照及图片裁剪(6.0以上权限处理及7.0以上文件管理)

最近做项目中涉及到了图片相关功能 ,在使用安卓6.0手机及7.1手机拍照时,遇到了因权限及文件管理导致程序崩溃等问题.  刚好把功能修改完,把代码简单地贴一下,方便以后使用. --主界面 代码 -- public class MainActivity extends AppCompatActivity { //拍照按钮 private Button take_photo; //显示裁剪后的图片 private ImageView photo_iv; private static final in

Android调用手机拍照功能的方法

本文实例讲述了Android调用手机拍照功能的方法.分享给大家供大家参考.具体如下: 一.main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" andr