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

发布时间 - 2026-01-10 23:26:49    点击率:

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

/**
 * 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实现调用系统图库与相机设置头像并保存在本地及服务器 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!


# android  # 调用系统图库  # Android 系统服务TelecomService启动过程原理分析  # Android 添加系统服务的方法详解  # Android中获得正在运行的程序和系统服务的方法  # 往Android系统中添加服务的方法教程  # Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法  # Ubuntu中为Android系统实现内置Java应用程序测试Application Framewo  # Android编程获取系统隐藏服务实现锁屏的方法  # Android系统服务是如何获取的  # 给大家  # 加载  # 所述  # 小编  # 图片上传  # 就不  # 说了  # 不多  # 自定义  # 再去  # 只对  # 给我留言  # 并保存  # 有任何  # 器上  # 下次  # 使用了  # 抗锯齿  # imageData  # RESULT_OK 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel集合Collection怎么用_Laravel集合常用函数详解  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  如何在香港服务器上快速搭建免备案网站?  C#如何调用原生C++ COM对象详解  如何用景安虚拟主机手机版绑定域名建站?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  C语言设计一个闪闪的圣诞树  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何在IIS中新建站点并解决端口绑定冲突?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel如何发送系统通知?(Notification渠道示例)  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel怎么判断请求类型_Laravel Request isMethod用法  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  网页设计与网站制作内容,怎样注册网站?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel如何与Inertia.js和Vue/React构建现代单页应用  非常酷的网站设计制作软件,酷培ai教育官方网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何快速配置高效服务器建站软件?  如何在Tomcat中配置并部署网站项目?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Android自定义控件实现温度旋转按钮效果  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  焦点电影公司作品,电影焦点结局是什么?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  什么是javascript作用域_全局和局部作用域有什么区别?  如何在万网利用已有域名快速建站?  IOS倒计时设置UIButton标题title的抖动问题  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  智能起名网站制作软件有哪些,制作logo的软件?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  js代码实现下拉菜单【推荐】  个人网站制作流程图片大全,个人网站如何注销?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  如何利用DOS批处理实现定时关机操作详解  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  如何在 React 中条件性地遍历数组并渲染元素  如何用PHP工具快速搭建高效网站?