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如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  如何打造高效商业网站?建站目的决定转化率  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何在万网ECS上快速搭建专属网站?  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何使用模型观察者?(Observer代码示例)  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  进行网站优化必须要坚持的四大原则  如何在景安服务器上快速搭建个人网站?  如何快速打造个性化非模板自助建站?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  如何快速选择适合个人网站的云服务器配置?  Laravel如何自定义错误页面(404, 500)?(代码示例)  jQuery validate插件功能与用法详解  利用python获取某年中每个月的第一天和最后一天  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何在腾讯云服务器快速搭建个人网站?  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在Ubuntu系统下快速搭建WordPress个人网站?  Linux系统命令中tree命令详解  如何在服务器上三步完成建站并提升流量?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  如何登录建站主机?访问步骤全解析  香港服务器选型指南:免备案配置与高效建站方案解析  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何在自有机房高效搭建专业网站?  网易LOFTER官网链接 老福特网页版登录地址  nodejs redis 发布订阅机制封装实现方法及实例代码  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何快速搭建支持数据库操作的智能建站平台?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel如何实现用户注册和登录?(Auth脚手架指南)  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  简单实现jsp分页  如何挑选优质建站一级代理提升网站排名?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Python3.6正式版新特性预览  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Swift中switch语句区间和元组模式匹配  Laravel怎么清理缓存_Laravel optimize clear命令详解  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口