当前位置: 移动技术网 > IT编程>移动开发>Android > Android实现调用系统图库与相机设置头像并保存在本地及服务器

Android实现调用系统图库与相机设置头像并保存在本地及服务器

2019年07月24日  | 移动技术网IT编程  | 我要评论

绝句杜甫,血色浪漫,suckerducker

废话不多说了,直接给大家贴代码了,具体代码如下所述:

/**
 * 1、实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还
 * 需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求
 * 2、使用了picasso框架以及自定义bitmaputils工具类
 * 3、记得加上相关权限
 * <uses-permission android:name="android.permission.internet"></uses-permission>
 <uses-permission android:name="android.permission.camera"/>
 <uses-permission android:name="android.permission.write_external_storage"></uses-permission>
 * */
public class mainactivity extends appcompatactivity implements view.onclicklistener {
  private imageview iv;//要设置的头像
  private button btn_photo;//调用相册按钮
  private button btn_camera;//调用相机按钮
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    iv=(imageview) findviewbyid(r.id.iv);
    btn_photo = (button) findviewbyid(r.id.btn_photo);
    btn_camera = (button) findviewbyid(r.id.btn_camera);
    btn_photo.setonclicklistener(this);
    btn_camera.setonclicklistener(this);
  }
  @override
  public void onclick(view v) {
    switch (v.getid()) {
      case r.id.btn_photo://打开系统相册
        intent intent=new intent(intent.action_pick, mediastore.images.media.external_content_uri);
        startactivityforresult(intent,100);
        break;
      case r.id.btn_camera://打开系统相机
        intent intent2=new intent(mediastore.action_image_capture);
        startactivityforresult(intent2,200);
        break;
    }
  }
  @requiresapi(api = build.version_codes.kitkat)
  @override
  protected void onactivityresult(int requestcode, int resultcode, intent data) {
    super.onactivityresult(requestcode, resultcode, data);
    if(requestcode==100&&resultcode==result_ok&&data!=null){//系统相册
      uri imagedata = data.getdata();
      string path=getpath(imagedata);
      bitmap bitmap = bitmapfactory.decodefile(path);
      bitmap bitmap1 = bitmaputils.zoom(bitmap, iv.getwidth(), iv.getheight());
      bitmap bitmap2 = bitmaputils.circlebitmap(bitmap1);
      //加载显示
      iv.setimagebitmap(bitmap2);
      //bitmap图片上传到服务器......
      //bitmap图片保存到本地
      saveimage(bitmap2);
    }else if(requestcode==200&&resultcode==result_ok&&data!=null){//系统相机
      bitmap bitmap = (bitmap) data.getextras().get("data");
      bitmaputils.zoom(bitmap,iv.getwidth(),iv.getheight());
      bitmap=bitmaputils.circlebitmap(bitmap);
      //加载显示
      iv.setimagebitmap(bitmap);
      //bitmap图片上传到服务器......
      //bitmap图片保存到本地
      saveimage(bitmap);
    }
  }
  /**
   * 数据的存储。(5种)
   * bimap:内存层面的图片对象。
   *
   * 存储--->内存:
   *   bitmapfactory.decodefile(string filepath);
   *   bitmapfactory.decodestream(inputstream is);
   * 内存--->存储:
   *   bitmap.compress(bitmap.compressformat.png,100,outputstream os);
   */
  private void saveimage(bitmap bitmap) {
    file filesdir;
    if(environment.getexternalstoragestate().equals(environment.media_mounted)){//判断sd卡是否挂载
      //路径1:storage/sdcard/android/data/包名/files
      filesdir = this.getexternalfilesdir("");
    }else{//手机内部存储
      //路径:data/data/包名/files
      filesdir = this.getfilesdir();
    }
    fileoutputstream fos = null;
    try {
      file file = new file(filesdir,"icon.png");
      fos = new fileoutputstream(file);
      bitmap.compress(bitmap.compressformat.png, 100,fos);
    } catch (filenotfoundexception e) {
      e.printstacktrace();
    }finally{
      if(fos != null){
        try {
          fos.close();
        } catch (ioexception e) {
          e.printstacktrace();
        }
      }
    }
  }
  //如果本地有,就不需要再去联网去请求
  private boolean readimage() {
    file filesdir;
    if(environment.getexternalstoragestate().equals(environment.media_mounted)){//判断sd卡是否挂载
      //路径1:storage/sdcard/android/data/包名/files
      filesdir = getexternalfilesdir("");
    }else{//手机内部存储
      //路径:data/data/包名/files
      filesdir = getfilesdir();
    }
    file file = new file(filesdir,"icon.png");
    if(file.exists()){
      //存储--->内存
      bitmap bitmap = bitmapfactory.decodefile(file.getabsolutepath());
      iv.setimagebitmap(bitmap);
      return true;
    }
    return false;
  }
  @requiresapi(api = build.version_codes.kitkat)
  private string getpath(uri uri) {
    int sdkversion = build.version.sdk_int;
    //高于4.4.2的版本
    if (sdkversion >= 19) {
      log.e("tag", "uri auth: " + uri.getauthority());
      if (isexternalstoragedocument(uri)) {
        string docid = documentscontract.getdocumentid(uri);
        string[] split = docid.split(":");
        string type = split[0];
        if ("primary".equalsignorecase(type)) {
          return environment.getexternalstoragedirectory() + "/" + split[1];
        }
      } else if (isdownloadsdocument(uri)) {
        final string id = documentscontract.getdocumentid(uri);
        final uri contenturi = contenturis.withappendedid(uri.parse("content://downloads/public_downloads"),
            long.valueof(id));
        return getdatacolumn(this, contenturi, null, null);
      } else if (ismediadocument(uri)) {
        final string docid = documentscontract.getdocumentid(uri);
        final string[] split = docid.split(":");
        final string type = split[0];
        uri contenturi = null;
        if ("image".equals(type)) {
          contenturi = mediastore.images.media.external_content_uri;
        } else if ("video".equals(type)) {
          contenturi = mediastore.video.media.external_content_uri;
        } else if ("audio".equals(type)) {
          contenturi = mediastore.audio.media.external_content_uri;
        }
        final string selection = "_id=?";
        final string[] selectionargs = new string[]{split[1]};
        return getdatacolumn(this, contenturi, selection, selectionargs);
      } else if (ismedia(uri)) {
        string[] proj = {mediastore.images.media.data};
        cursor actualimagecursor = this.managedquery(uri, proj, null, null, null);
        int actual_image_column_index = actualimagecursor.getcolumnindexorthrow(mediastore.images.media.data);
        actualimagecursor.movetofirst();
        return actualimagecursor.getstring(actual_image_column_index);
      }
    } else if ("content".equalsignorecase(uri.getscheme())) {
      // return the remote address
      if (isgooglephotosuri(uri))
        return uri.getlastpathsegment();
      return getdatacolumn(this, uri, null, null);
    }
    // file
    else if ("file".equalsignorecase(uri.getscheme())) {
      return uri.getpath();
    }
    return null;
  }
  /**
   * uri路径查询字段
   *
   * @param context
   * @param uri
   * @param selection
   * @param selectionargs
   * @return
   */
  public static string getdatacolumn(context context, uri uri, string selection, string[] selectionargs) {
    cursor cursor = null;
    final string column = "_data";
    final string[] projection = {column};
    try {
      cursor = context.getcontentresolver().query(uri, projection, selection, selectionargs, null);
      if (cursor != null && cursor.movetofirst()) {
        final int index = cursor.getcolumnindexorthrow(column);
        return cursor.getstring(index);
      }
    } finally {
      if (cursor != null)
        cursor.close();
    }
    return null;
  }
  private boolean isexternalstoragedocument(uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getauthority());
  }
  public static boolean isdownloadsdocument(uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getauthority());
  }
  public static boolean ismediadocument(uri uri) {
    return "com.android.providers.media.documents".equals(uri.getauthority());
  }
  public static boolean ismedia(uri uri) {
    return "media".equals(uri.getauthority());
  }
  /**
   * @param uri the uri to check.
   * @return whether the uri authority is google photos.
   */
  public static boolean isgooglephotosuri(uri uri) {
    return "com.google.android.apps.photos.content".equals(uri.getauthority());
  }
  /**
   * 判断本地是否有该图片,没有则去联网请求
   * */
  @override
  protected void onresume() {
    super.onresume();
    if(readimage()){
      return;
    }
  }
}
//bitmaputils工具类public class bitmaputils { /**
   * 该方法用于将图片进行圆形处理
   * */  public static bitmap circlebitmap(bitmap source){    //默认只对宽进行处理    int width=source.getwidth();    bitmap bitmap=bitmap.createbitmap(width,width,bitmap.config.argb_8888);    canvas canvas=new canvas(bitmap);    paint paint=new paint();    //设置抗锯齿    paint.setantialias(true);    canvas.drawcircle(width/2,width/2,width/2,paint);    paint.setxfermode(new porterduffxfermode(porterduff.mode.src_in));    canvas.drawbitmap(source,0,0,paint);    return bitmap;  }  /**   * 该方法用于图片压缩处理,注意width、height参数的类型必须是float   * */  public static bitmap zoom(bitmap source,float width,float height){    matrix matrix=new matrix();    //图片进行压缩处理    matrix.postscale(width/source.getwidth(),height/source.getheight());    bitmap bitmap = bitmap.createbitmap(source, 0, 0, source.getwidth(), source.getheight(), matrix, false);    return bitmap;  }}

以上所述是小编给大家介绍的android实现调用系统图库与相机设置头像并保存在本地及服务器 ,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网