photo

时间:2021-03-23 23:56:55

我们在android开发过程中 经常有做到发图片或修改上传头像的功能 即要调用系统相册 如何调用系统相册并处理返回的数据呢?因为随着android手机系统的提高 不同系统的手机对调用相册并处理相册不同,所以我们就要做处理 让它可以兼容所有不同版本及系统的手机。

方法/步骤

  1. 进行相册有两种方式:一种是直接进入相册

    public static Intent INTENT_ACTION_PICK() {

    Intent intent = new Intent(Intent.ACTION_PICK,

    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

    intent.setType("image/*");

    return intent;

    }

    另一种是直接进入相册目录

    public static Intent INTENT_ACTION_CONTENT() {

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT,

    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

    intent.setType("image/*");

    return intent;

    }

    startActivityForResult(intent,PICTURE);

  2. 写一个回调方法接收返回相册的路径

    public interface PhotoCallBack {   void onSuccess(String picturePath);// 拿取相片成功   void onFailure();// 拿取相片失败

    }

    这里写成回调方法的原因是 我们在开发过程中不仅仅是一个模块用到调用系统相册 写成一个回调方法 并在在一个类里处理返回的数据

  3. 根据SDK_INT来分类处理相册返回相片路径

    public static void getPhotoURLByAlbum(Context context, Intent data,      PhotoCallBack callback) {   if (data == null) {      callback.onFailure();      return;   }   final Uri selectedImage = data.getData();   if (selectedImage == null) {      callback.onFailure();      return;   }   String picturePath = "";   // 关于Android4.4的图片路径获取,如果回来的Uri的格式有两种   if (Build.VERSION.SDK_INT >= 19         && DocumentsContract.isDocumentUri(context, selectedImage)) {      String wholeID = DocumentsContract.getDocumentId(selectedImage);      String id = wholeID.split(":")[1];      String[] column = { MediaStore.Images.Media.DATA };      String sel = MediaStore.Images.Media._ID + "=?";      Cursor cursor = context.getContentResolver().query(            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel,            new String[] { id }, null);      if (cursor.moveToNext()) {         int columnIndex = cursor.getColumnIndex(column[0]);         picturePath = cursor.getString(columnIndex);         callback.onSuccess(picturePath);// 获取图片路径      }      cursor.close();   } else {      String[] projection = { MediaStore.Images.Media.DATA };      Cursor cursor = context.getContentResolver().query(selectedImage,            projection, null, null, null);      if (cursor.moveToNext()) {         int column_index = cursor               .getColumnIndex(MediaStore.Images.Media.DATA);         picturePath = cursor.getString(column_index);         callback.onSuccess(picturePath);// 获取图片路径         Log.e("aa", "aa");      }      cursor.close();   }}

  4. 根据返回的相片路径URL来获得我们需要的Bitmap 我们就可以在ImageView直接显示了

    public static Bitmap getBitmapByURL(String PhotoURL) {   BitmapFactory.Options options = new BitmapFactory.Options()   options.inJustDecodeBounds = false;   Bitmap bitmap = BitmapFactory.decodeFile(PhotoURL, options);   if (bitmap != null) {      return bitmap;   }   return null;}   //   // 把图片保存到我们的系统图库中

    public static void saveMyImageToGallery(Context context, Bitmap bmp) {    File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");    if (!appDir.exists()) {        appDir.mkdir();    }    String fileName = System.currentTimeMillis() + ".jpg";    File file = new File(appDir, fileName);    try {        FileOutputStream fos = new FileOutputStream(file);        bmp.compress(CompressFormat.JPEG, 100, fos);        fos.flush();        fos.close();    } catch (FileNotFoundException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();       try {        MediaStore.Images.Media.insertImage(context.getContentResolver(),            file.getAbsolutePath(), fileName, null);    } catch (FileNotFoundException e) {        e.printStackTrace();    }}