Android头像上传功能的实现代码(获取头像加剪切)

Android头像上传功能的实现代码(获取头像加剪切),第1张

概述因为项目中需要用到头像上传的功能,所以就下个Ddmo先来实现下。demo我是类似仿微信的,在一个GridView中展示所有的图片,其中第一个item可以去照相;获取到图片后再进行剪切

因为项目中需要用到头像上传的功能,所以就下个Ddmo先来实现下。

demo我是类似仿微信的,在一个GrIDVIEw中展示所有的图片,其中第一个item可以去照相;获取到图片后再进行剪切。

图片的剪切是从网上找的感觉不错就用,暂时也没有测试。

获取图片可以用:https://github.com/lovetuzitong/MultiImageSelector来实现

这里的圆形图像是用https://github.com/hdodenhof/CircleImageView来实现的

Demo写的比较粗糙,效果只是在4.4的手机和7.0的模拟器跑了一遍,所以可能会出现问题的。

如下是demo的效果图:

如下是选择图片中的代码

通过LoaderManager来获取到所有的图片,然后第一个进行拍照的处理

package com.item.demo.photo.activity;import androID.Manifest;import androID.app.LoaderManager;import androID.content.ContentResolver;import androID.content.Context;import androID.content.CursorLoader;import androID.content.Intent;import androID.content.Loader;import androID.content.pm.PackageManager;import androID.database.Cursor;import androID.net.Uri;import androID.os.Build;import androID.os.Environment;import androID.provIDer.MediaStore;import androID.support.annotation.NonNull;import androID.support.v4.content.ContextCompat;import androID.support.v4.content.fileProvIDer;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.text.TextUtils;import androID.util.Log;import androID.vIEw.VIEw;import androID.Widget.AdapterVIEw;import androID.Widget.GrIDVIEw;import androID.Widget.ImageVIEw;import com.item.demo.photo.BuildConfig;import com.item.demo.photo.R;import com.item.demo.photo.adapter.MyPhotoAdapter;import com.item.demo.photo.uilts.Image;import java.io.file;import java.util.ArrayList;import java.util.List;/** * 图片选择界面 */public class MyPhotoActivity extends AppCompatActivity {  private static final int REQUEST_CAPTURE = 100;  //private static final int REQUEST_PICK = 101;  private static final int REQUEST_CROP_PHOTO = 102;  public static final int FINSH_RESulT = 104;//截图后的返回  private static final int LOADER_ID = 0x0100;  private LoadCallBack mload = new LoadCallBack();  private MyPhotoAdapter mAdapter;  private List<Image> images = new ArrayList<>();  //调用照相机返回图片文件  private file tempfile;  private static final int MIN_IMAGE_file_SIZE = 10 * 1024; // 最小的图片大小  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_my_photo);    GrIDVIEw gv_photo = (GrIDVIEw)findVIEwByID(R.ID.gv_photo);    ImageVIEw img_back = (ImageVIEw)findVIEwByID(R.ID.iv_back);    images.add(new Image());    mAdapter = new MyPhotoAdapter(this,images);    gv_photo.setAdapter(mAdapter);    gv_photo.setonItemClickListener(new AdapterVIEw.OnItemClickListener() {      @OverrIDe      public voID onItemClick(AdapterVIEw<?> adapterVIEw,VIEw vIEw,int i,long l) {        if(i == 0){          //第一个就去照相          if(hasPermission(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})){            gotoCamera();          }else {            requestPermission(0x02,new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE});          }        }else {          //这里点击获取到图片地址然后裁剪          gotoClipActivity(Uri.parse(images.get(i).getPath()));        }      }    });    img_back.setonClickListener(new VIEw.OnClickListener() {      @OverrIDe      public voID onClick(VIEw vIEw) {        finish();      }    });  }  @OverrIDe  protected voID onStart() {    super.onStart();    if(hasPermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE})){      getLoaderManager().initLoader(LOADER_ID,null,mload);    }else {      requestPermission(0x01,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE});    }  }  private class LoadCallBack implements LoaderManager.LoaderCallbacks<Cursor>{    private final String[] IMAGE_PROJECTION = new String[]{        MediaStore.Images.Media._ID,//ID        MediaStore.Images.Media.DATA,//图片路径        MediaStore.Images.Media.DATE_ADDED//图片的创建时间    };    @OverrIDe    public Loader<Cursor> onCreateLoader(int ID,Bundle args) {      //创建一个Loader      if(ID == LOADER_ID){        //如果是我们的ID则进行初始化        return new CursorLoader(getBaseContext(),MediaStore.Images.Media.EXTERNAL_CONTENT_URI,IMAGE_PROJECTION,IMAGE_PROJECTION[2] + " DESC");      }      return null;    }    @OverrIDe    public voID onLoadFinished(Loader<Cursor> loader,Cursor data) {      //当Loader加载完成时      List<Image> images = new ArrayList<>();      //判断是否有数据      if(data != null){        int count = data.getCount();        if(count > 0){          data.movetoFirst();          // 得到对应的列的Index坐标          int indexID = data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]);          int indexPath = data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]);          int indexDate = data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]);          do {            // 循环读取,直到没有下一条数据            int ID = data.getInt(indexID);            String path = data.getString(indexPath);            long dateTime = data.getLong(indexDate);            file file = new file(path);            if (!file.exists() || file.length() < MIN_IMAGE_file_SIZE) {              // 如果没有图片,或者图片大小太小,则跳过              continue;            }            // 添加一条新的数据            Image image = new Image();            image.setID(ID);            image.setPath(path);            image.setDate(dateTime);            images.add(image);          } while (data.movetoNext());        }      }      updateSource(images);    }    @OverrIDe    public voID onLoaderreset(Loader<Cursor> loader) {      updateSource(null);    }  }  /**   * 通知Adapter数据更改的方法   * @param images 新的数据   */  private voID updateSource(List<Image> images){    this.images.clear();    this.images.add(new Image());    if(images == null || images.size() == 0) return;    this.images.addAll(images);    mAdapter.notifyDataSetChanged();  }  /**   *权限的返回   */  @OverrIDe  public voID onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode,permissions,grantResults);    switch(requestCode){      case 0x02:        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){          gotoCamera();        }        break;      case 0x01:        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){          getLoaderManager().initLoader(LOADER_ID,mload);        }    }  }  @OverrIDe  protected voID onActivityResult(int requestCode,int resultCode,Intent data) {    super.onActivityResult(requestCode,resultCode,data);    switch (requestCode){      case REQUEST_CAPTURE://系统相机返回        if(resultCode == RESulT_OK){          Log.d("jIEjIE","--------相机---------" + Uri.fromfile(tempfile).toString());          Log.d("jIEjIE","--------path----------" + getRealfilePathFromUri(MyPhotoActivity.this,Uri.fromfile(tempfile)));          gotoClipActivity(Uri.fromfile(tempfile));        }        break;      case REQUEST_CROP_PHOTO:        if(resultCode == RESulT_OK){          if(data != null){            Uri uri = data.getData();            Log.d("jIEjIE","-------------" + data.getData().getPath());            String cropImagePath = getRealfilePathFromUri(MyPhotoActivity.this,uri);            Log.d("jIEjIE","------crop--------" + cropImagePath);            Intent intent = new Intent();            intent.putExtra("image",cropImagePath);            setResult(FINSH_RESulT,intent);            MyPhotoActivity.this.finish();          }        }        break;    }  }  /**   * 跳转到系统照相机   */  private voID gotoCamera(){    String SDState = Environment.getExternalStorageState();    //判断SD卡是否存在    if(SDState.equals(Environment.MEDIA_MOUNTED)){      tempfile = new file(checkDirPath(Environment.getExternalStorageDirectory().getPath()+ "/image/"),System.currentTimeMillis() + ".jpg");      //隐式的打开调用系统相册      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){        intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);        //如果是7.0及以上的系统使用fileProvIDer的方式创建一个Uri        Uri contentUri = fileProvIDer.getUriForfile(MyPhotoActivity.this,BuildConfig.APPliCATION_ID + ".fileProvIDer",tempfile);        intent.putExtra(MediaStore.EXTRA_OUTPUT,contentUri);      }else {        intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromfile(tempfile));      }      startActivityForResult(intent,REQUEST_CAPTURE);    }  }  /**   * 打开截图的界面   * @param uri   */  private voID gotoClipActivity(Uri uri){    if(uri == null){      return;    }    Intent intent = new Intent(this,ClipImageActivity.class);    intent.putExtra("type",1);    intent.setData(uri);    startActivityForResult(intent,REQUEST_CROP_PHOTO);  }  /**   * 检查文件是否存在   */  private static String checkDirPath(String dirPath) {    if (TextUtils.isEmpty(dirPath)) {      return "";    }    file dir = new file(dirPath);    if (!dir.exists()) {      dir.mkdirs();    }    return dirPath;  }  /**   * 判断是否有指定的权限   */  public boolean hasPermission(String... permissions) {    for (String permisson : permissions) {      if (ContextCompat.checkSelfPermission(this,permisson)          != PackageManager.PERMISSION_GRANTED) {        return false;      }    }    return true;  }  /**   * 申请指定的权限.   */  public voID requestPermission(int code,String... permissions) {    if (Build.VERSION.SDK_INT >= 23) {      requestPermissions(permissions,code);    }  }  /**   * 根据Uri返回文件绝对路径   * 兼容了file:///开头的 和 content://开头的情况   */  public static String getRealfilePathFromUri(final Context context,final Uri uri) {    if (null == uri) return null;    final String scheme = uri.getScheme();    String data = null;    if (scheme == null)      data = uri.getPath();    else if (ContentResolver.SCHEME_file.equals(scheme)) {      data = uri.getPath();    } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {      Cursor cursor = context.getContentResolver().query(uri,new String[]{MediaStore.Images.ImageColumns.DATA},null);      if (null != cursor) {        if (cursor.movetoFirst()) {          int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);          if (index > -1) {            data = cursor.getString(index);          }        }        cursor.close();      }    }    return data;  }}

其中处理动态的权限还需要添加7.0的照相处理

在清单文件中加如下配置:

  <provIDer      androID:name="androID.support.v4.content.fileProvIDer"      androID:authoritIEs="com.item.demo.photo.fileProvIDer"      androID:grantUriPermissions="true"      androID:exported="false">      <Meta-data        androID:name="androID.support.file_PROVIDER_PATHS"        androID:resource="@xml/file_paths" />    </provIDer>

图片的剪切

package com.item.demo.photo.activity;import androID.content.Intent;import androID.graphics.Bitmap;import androID.net.Uri;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.util.Log;import androID.vIEw.VIEw;import androID.Widget.ImageVIEw;import androID.Widget.TextVIEw;import com.item.demo.photo.R;import com.item.demo.photo.vIEw.ClipVIEwLayout;import java.io.file;import java.io.IOException;import java.io.OutputStream;/** * 图片剪切 */public class ClipImageActivity extends AppCompatActivity implements VIEw.OnClickListener {  private ClipVIEwLayout clipVIEwLayout1;  private ClipVIEwLayout clipVIEwLayout2;  private ImageVIEw back;  private TextVIEw tv_ok;  //类别 1:圆形 2:方形  private int type;  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_clip_image);    type = getIntent().getIntExtra("type",1);    initVIEw();  }  private voID initVIEw() {    clipVIEwLayout1 = (ClipVIEwLayout)findVIEwByID(R.ID.clipVIEwLayout1);    clipVIEwLayout2 = (ClipVIEwLayout)findVIEwByID(R.ID.clipVIEwLayout2);    back = (ImageVIEw)findVIEwByID(R.ID.iv_back);    tv_ok = (TextVIEw)findVIEwByID(R.ID.tv_ok);    back.setonClickListener(this);    tv_ok.setonClickListener(this);  }  @OverrIDe  protected voID onResume() {    super.onResume();    if(type == 1){      clipVIEwLayout1.setVisibility(VIEw.VISIBLE);      clipVIEwLayout2.setVisibility(VIEw.GONE);      //设置图片资源      clipVIEwLayout1.setimageSrc(getIntent().getData());    }else {      clipVIEwLayout2.setVisibility(VIEw.VISIBLE);      clipVIEwLayout1.setVisibility(VIEw.GONE);      clipVIEwLayout2.setimageSrc(getIntent().getData());    }  }  @OverrIDe  public voID onClick(VIEw vIEw) {    switch (vIEw.getID()){      case R.ID.iv_back:        finish();        break;      case R.ID.tv_ok:        generateUriAndReturn();        break;    }  }  /**   * 生成Uri并且通过setResult返回给打开的Activity   */  private voID generateUriAndReturn() {    //调用返回剪切图    Bitmap zoomedCropBitmap;    if (type == 1) {      zoomedCropBitmap = clipVIEwLayout1.clip();    } else {      zoomedCropBitmap = clipVIEwLayout2.clip();    }    if (zoomedCropBitmap == null) {      Log.e("androID","zoomedCropBitmap == null");      return;    }    Uri mSaveUri = Uri.fromfile(new file(getCacheDir(),"cropped_" + System.currentTimeMillis() + ".jpg"));    if (mSaveUri != null) {      OutputStream outputStream = null;      try {        outputStream = getContentResolver().openOutputStream(mSaveUri);        if (outputStream != null) {          zoomedCropBitmap.compress(Bitmap.CompressFormat.JPEG,90,outputStream);        }      } catch (IOException ex) {        Log.e("androID","Cannot open file: " + mSaveUri,ex);      } finally {        if (outputStream != null) {          try {            outputStream.close();          } catch (IOException e) {            e.printstacktrace();          }        }      }      Intent intent = new Intent();      intent.setData(mSaveUri);      setResult(RESulT_OK,intent);      finish();    }  }}

总结

以上所述是小编给大家介绍的AndroID头像上传功能的实现代码(获取头像加剪切),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

总结

以上是内存溢出为你收集整理的Android头像上传功能的实现代码(获取头像加剪切)全部内容,希望文章能够帮你解决Android头像上传功能的实现代码(获取头像加剪切)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1144624.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存