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

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

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

(0)

相关推荐

  • android 调用系统的照相机和图库实例详解

    android手机有自带的照相机和图库,我们做的项目中有时用到上传图片到服务器,今天做了一个项目用到这个功能,所以把我的代码记录下来和大家分享,第一次写博客希望各位大神多多批评. 首先上一段调用android相册和相机的代码: 复制代码 代码如下: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用android自带的照相机 photoUri = MediaStore.Images.Media.EXTERNAL_CON

  • Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

  • Android 调用系统相机拍摄获取照片的两种方法实现实例

    Android 调用系统相机拍摄获取照片的两种方法实现实例 在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的照片.下面是我总结的两种方法获取拍摄之后的照片,一种是通过Bundle来获取压缩过的照片,一种是通过SD卡获取的原图. 下面是演示代码: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:

  • Android 系统相机拍照后相片无法在相册中显示解决办法

    Android 系统相机拍照后相片无法在相册中显示解决办法 目前自己使用发送广播实现了效果 public void photo() { Intent openCameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCameraIntent, TAKE_PICTURE); } 解决方法: protected void onActivityResul

  • Android使用系统自带的相机实现一键拍照功能

    今天分享的是用系统自带的相机实现一键拍照功能. public class MainActivity extends AppCompatActivity { private static final int TAKE_PHOTO = 100; private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConte

  • Android如何调用系统相机拍照

    本文实例为大家分享了Android调用系统相机拍照的具体代码,供大家参考,具体内容如下 /** * 调用系统相机 */ private void takePhoto() { Uri uri = null; if (which_image == FRONT_IMAGE) { frontFile = new File(getSDPath() +"/test/front_" + getDate() + ".jpg"); uri = Uri.fromFile(frontFi

  • Android 实现调用系统照相机拍照和录像的功能

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

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

    废话不多说了,直接给大家贴代码了,具体代码如下所述: /** * 1.实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还 * 需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求 * 2.使用了picasso框架以及自定义BitmapUtils工具类 * 3.记得加上相关权限 * <uses-permission android:nam

  • Android调用系统图库获取图片的方法

    本文实例为大家分享了Android调用系统图库获取图片的具体代码,供大家参考,具体内容如下 1.开发工具与关键技术:Eclipse.AndroidStudio2.撰写时间:2020年05月28日 在做移动开发相信很多人都会用到调用系统的图库获取图片吧,那么今天我跟大家讲讲如何调用系统的图库获取图片呢!由于本次的内容有点多,所以,分几个步骤吧!废话就不多说啦!避免浪费大家的时间,回归正题.请看代码 第一步:在build.gradle的文件下确保安卓版本是6.0以上(targetSdkVersion

  • Android编程实现调用系统图库与裁剪图片功能

    本文实例讲述了Android编程实现调用系统图库与裁剪图片功能.分享给大家供大家参考,具体如下: 在Android开发中,调用系统图库和裁剪照片是很常见的需求.相对于自己实现这种功能,直接调用系统具有诸多优点,如不用考虑屏幕适配,不用担心性能问题,等等.因此,对于一般的需求,建议直接调用系统的功能,简便高效! 首先上效果图:    一.只调用系统图库(不裁剪),返回用户选择的图片.(只支持单选,如需多选则需要自己实现,可参考Android编程实现仿QQ照片选择器(按相册分类显示,多选添加)源码.

  • Android实现调用系统相册和拍照的Demo示例

    本文讲述了Android实现调用系统相册和拍照的Demo示例.分享给大家供大家参考,具体如下: 最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题,用高于4.4版本的系统就崩溃.所以,我还是想提取出来,给大家整理一下,一个比较完整无bug的demo,让大家收藏,留着以后用. 其实对于调用手机图库,高版本的系统会崩溃,是因为获取方法变了,所以我们应该

  • Android编程调用系统自带的拍照功能并返回JPG文件示例【附demo源码下载】

    本文实例讲述了Android编程调用系统自带的拍照功能返回JPG文件.分享给大家供大家参考,具体如下: package com.eboy.testcamera1; import java.io.File; import java.io.FileOutputStream; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bund

  • Android实现调用系统分享功能示例的总结

    Android分享-调用系统自带的分享功能 实现分享功能的几个办法 1.调用系统的分享功能 2.通过第三方SDK,如ShareSDK,友盟等 3.自行使用各自平台的SDK,比如QQ,微信,微博各自的SDK Android调用系统分享文本信息.单张图片.多个文件和指定分享到微信.QQ的实例代码: //www.jb51.net/article/112057.htm 同时分享图片和文字 private void share(String content, Uri uri){ Intent shareI

  • Android中调用系统的文件浏览器及自制简单的文件浏览器

    调用系统自带的文件浏览器 这很简单: /** 调用文件选择软件来选择文件 **/ private void showFileChooser() { intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); try { startActivityForResult(Intent.createChooser(inte

  • Android调用系统照相机拍照与摄像的方法

    前言 在很多场景中,都需要用到摄像头去拍摄照片或视频,在照片或视频的基础之上进行处理.但是Android系统源码是开源的,很多设备厂商均可使用,并且定制比较混乱.一般而言,在需要用到摄像头拍照或摄像的时候,均会直接调用系统现有的相机应用,去进行拍照或摄像,我们只取它拍摄的结果进行处理,这样避免了不同设备的摄像头的一些细节问题.本篇博客将介绍在Android应用中,如何调用系统现有的相机应用去拍摄照片与短片,并对其进行处理,最后均会以一个简单的Demo来演示效果. 1.系统现有相机应用的调用 对于

随机推荐