温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Android中实现选择相册照片并返回功能

发布时间:2021-05-22 16:47:56 来源:亿速云 阅读:432 作者:Leah 栏目:移动开发

这篇文章将为大家详细讲解有关怎么在Android中实现选择相册照片并返回功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

首先由于进行读写操作,要在 AndroidManifest.xml中声明权限:

<uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE” />  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

调用系统相册:

private static final int CHOOSE_PHOTO=0;  Intent intent = new Intent(“android.intent.action.GET_CONTENT”);  intent.setType(”image/*”);  startActivityForResult(intent, CHOOSE_PHOTO);  [java] view plain copy private static final int CHOOSE_PHOTO=0;  Intent intent = new Intent("android.intent.action.GET_CONTENT");  intent.setType("image/*");  startActivityForResult(intent, CHOOSE_PHOTO);

然后回调:

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {      switch (requestCode) {        case CHOOSE_PHOTO:          if (resultCode == RESULT_OK) {            Bitmap bitmap = null;            //判断手机系统版本号            if (Build.VERSION.SDK_INT >= 19) {              //4.4及以上系统使用这个方法处理图片              bitmap = ImgUtil.handleImageOnKitKat(this, data);    //ImgUtil是自己实现的一个工具类            } else {              //4.4以下系统使用这个方法处理图片              bitmap = ImgUtil.handleImageBeforeKitKat(this, data);            }            ImageView view = (ImageView) findViewById(R.id.personal_info_header_img);            view.setImageBitmap(bitmap);          }          break;        default:          break;      }    }
@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {      switch (requestCode) {        case CHOOSE_PHOTO:          if (resultCode == RESULT_OK) {            Bitmap bitmap = null;            //判断手机系统版本号            if (Build.VERSION.SDK_INT >= 19) {              //4.4及以上系统使用这个方法处理图片              bitmap = ImgUtil.handleImageOnKitKat(this, data);    //ImgUtil是自己实现的一个工具类            } else {              //4.4以下系统使用这个方法处理图片              bitmap = ImgUtil.handleImageBeforeKitKat(this, data);            }            ImageView view = (ImageView) findViewById(R.id.personal_info_header_img);            view.setImageBitmap(bitmap);          }          break;        default:          break;      }    }

将对图像的相关操作封装成一个ImgUtil类,便于使用:

import android.annotation.TargetApi;  import android.content.ContentUris;  import android.content.Context;  import android.content.Intent;  import android.content.SharedPreferences;  import android.database.Cursor;  import android.graphics.Bitmap;  import android.graphics.BitmapFactory;  import android.net.Uri;  import android.preference.PreferenceManager;  import android.provider.DocumentsContract;  import android.provider.MediaStore;  import android.text.TextUtils;  import java.io.ByteArrayInputStream;  import java.io.ByteArrayOutputStream;  /**   * Created by wbin on 2016/3/22.   */  public class ImgUtil {    //4.4及以上系统使用这个方法处理图片    @TargetApi(19)    public static Bitmap handleImageOnKitKat(Context context, Intent data) {      String imagePath = null;      Uri uri = data.getData();      if (DocumentsContract.isDocumentUri(context, uri)) {        //如果是document类型的Uri,则通过document id处理        String docId = DocumentsContract.getDocumentId(uri);        if (“com.android.providers.media.documents”.equals(uri.getAuthority())) {          String id = docId.split(”:”)[1]; //解析出数字格式的id          String selection = MediaStore.Images.Media._ID + ”=” + id;          imagePath = getImagePath(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);        } else if (“com.android.providers.downloads.documents”.equals(uri.getAuthority())) {          Uri contentUri = ContentUris.withAppendedId(              Uri.parse(”content://downloads/public_downloads”), Long.valueOf(docId));          imagePath = getImagePath(context, contentUri, null);        }      } else if (“content”.equalsIgnoreCase(uri.getScheme())) {        //如果不是document类型的Uri,则使用普通方式处理        imagePath = getImagePath(context, uri, null);      }      return getImage(imagePath);    }    //4.4以下系统使用这个方法处理图片    public static Bitmap handleImageBeforeKitKat(Context context, Intent data) {      Uri uri = data.getData();      String imagePath = getImagePath(context, uri, null);      return getImage(imagePath);    }    public static String getImagePath(Context context, Uri uri, String selection) {      String path = null;      //通过Uri和selection来获取真实的图片路径      Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);      if (cursor != null) {        if (cursor.moveToFirst()) {          path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));        }        cursor.close();      }      return path;    }    //对bitmap进行质量压缩    public static Bitmap compressImage(Bitmap image) {      ByteArrayOutputStream baos = new ByteArrayOutputStream();      image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中      int options = 100;      while (baos.toByteArray().length / 1024 > 100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩        baos.reset();//重置baos即清空baos        image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中        options -= 10;//每次都减少10      }      ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中      Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片      return bitmap;    }    //传入图片路径,返回压缩后的bitmap    public static Bitmap getImage(String srcPath) {      if (TextUtils.isEmpty(srcPath)) //如果图片路径为空 直接返回        return null;      BitmapFactory.Options newOpts = new BitmapFactory.Options();      //开始读入图片,此时把options.inJustDecodeBounds 设回true了      newOpts.inJustDecodeBounds = true;      Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);//此时返回bm为空      newOpts.inJustDecodeBounds = false;      int w = newOpts.outWidth;      int h = newOpts.outHeight;      //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为      float hh = 800f;//这里设置高度为800f      float ww = 480f;//这里设置宽度为480f      //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可      int be = 1;//be=1表示不缩放      if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放        be = (int) (newOpts.outWidth / ww);      } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放        be = (int) (newOpts.outHeight / hh);      }      if (be <= 0)        be = 1;      newOpts.inSampleSize = be;//设置缩放比例      //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了      bitmap = BitmapFactory.decodeFile(srcPath, newOpts);      return compressImage(bitmap);//压缩好比例大小后再进行质量压缩    }  }
import android.annotation.TargetApi;  import android.content.ContentUris;  import android.content.Context;  import android.content.Intent;  import android.content.SharedPreferences;  import android.database.Cursor;  import android.graphics.Bitmap;  import android.graphics.BitmapFactory;  import android.net.Uri;  import android.preference.PreferenceManager;  import android.provider.DocumentsContract;  import android.provider.MediaStore;  import android.text.TextUtils;  import java.io.ByteArrayInputStream;  import java.io.ByteArrayOutputStream;  /**   * Created by wbin on 2016/3/22.   */  public class ImgUtil {    //4.4及以上系统使用这个方法处理图片    @TargetApi(19)    public static Bitmap handleImageOnKitKat(Context context, Intent data) {      String imagePath = null;      Uri uri = data.getData();      if (DocumentsContract.isDocumentUri(context, uri)) {        //如果是document类型的Uri,则通过document id处理        String docId = DocumentsContract.getDocumentId(uri);        if ("com.android.providers.media.documents".equals(uri.getAuthority())) {          String id = docId.split(":")[1]; //解析出数字格式的id          String selection = MediaStore.Images.Media._ID + "=" + id;          imagePath = getImagePath(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);        } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {          Uri contentUri = ContentUris.withAppendedId(              Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));          imagePath = getImagePath(context, contentUri, null);        }      } else if ("content".equalsIgnoreCase(uri.getScheme())) {        //如果不是document类型的Uri,则使用普通方式处理        imagePath = getImagePath(context, uri, null);      }      return getImage(imagePath);    }    //4.4以下系统使用这个方法处理图片    public static Bitmap handleImageBeforeKitKat(Context context, Intent data) {      Uri uri = data.getData();      String imagePath = getImagePath(context, uri, null);      return getImage(imagePath);    }    public static String getImagePath(Context context, Uri uri, String selection) {      String path = null;      //通过Uri和selection来获取真实的图片路径      Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);      if (cursor != null) {        if (cursor.moveToFirst()) {          path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));        }        cursor.close();      }      return path;    }    //对bitmap进行质量压缩    public static Bitmap compressImage(Bitmap image) {      ByteArrayOutputStream baos = new ByteArrayOutputStream();      image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中      int options = 100;      while (baos.toByteArray().length / 1024 > 100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩        baos.reset();//重置baos即清空baos        image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中        options -= 10;//每次都减少10      }      ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中      Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片      return bitmap;    }    //传入图片路径,返回压缩后的bitmap    public static Bitmap getImage(String srcPath) {      if (TextUtils.isEmpty(srcPath)) //如果图片路径为空 直接返回        return null;      BitmapFactory.Options newOpts = new BitmapFactory.Options();      //开始读入图片,此时把options.inJustDecodeBounds 设回true了      newOpts.inJustDecodeBounds = true;      Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);//此时返回bm为空      newOpts.inJustDecodeBounds = false;      int w = newOpts.outWidth;      int h = newOpts.outHeight;      //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为      float hh = 800f;//这里设置高度为800f      float ww = 480f;//这里设置宽度为480f      //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可      int be = 1;//be=1表示不缩放      if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放        be = (int) (newOpts.outWidth / ww);      } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放        be = (int) (newOpts.outHeight / hh);      }      if (be <= 0)        be = 1;      newOpts.inSampleSize = be;//设置缩放比例      //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了      bitmap = BitmapFactory.decodeFile(srcPath, newOpts);      return compressImage(bitmap);//压缩好比例大小后再进行质量压缩    }  }

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

关于怎么在Android中实现选择相册照片并返回功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI