android系统相机相册调用封装

11人阅读 评论(0) 收藏 举报
public abstract class PickPhotoActivity extends BaseActivity {
    private static final String KEY_PHOTO_PATH = "photo_path";
    private static final int TAKE_PHOTO_LARGR = 1000;
    private static final int PICK_PHOTO_ALBUM = 1001;
    private static final int TAKE_PHOTO_LARGR_CROP = 1002;
    private static final int PICK_PHOTO_ALBUM_CROP = 1003;
    private static final int CROP_PHOTO = 1004;

    private String mSavePhotoPath = null;

    //调用Camera拍照时,此Activity很容易因为内存问题,被系统Kill掉,因此需要保存拍照的路径
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (mSavePhotoPath != null) {
            outState.putString(KEY_PHOTO_PATH, mSavePhotoPath);
        }
        super.onSaveInstanceState(outState);
    }

    //获取之前保存的拍照的路径 
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        mSavePhotoPath = savedInstanceState.getString(KEY_PHOTO_PATH);
        super.onRestoreInstanceState(savedInstanceState);
    }

    /**
     * @param needCapture true 拍照; false 相册
     * @param needCrop    true 裁剪
     */
    public void pickPhoto(final boolean needCapture, final boolean needCrop) {
        使用RxPermission进行权限判断
         PermissionsUtil.request(this, new PermissionsUtil.OnPermission() {
                    @Override
                    public void onPermissionGranted(Context context) {
                        if (needCapture) {
                            String filePath = Environment.getExternalStorageDirectory() + "/DCIM/Camera/";
                            File file = new File(filePath);
                            if (!file.exists()) {
                                file.mkdir();
                            }
                            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            mSavePhotoPath = filePath + ImagePicker.imageName();
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
                                    .fromFile(new File(mSavePhotoPath)));
                            startActivityForResult(intent, needCrop ? TAKE_PHOTO_LARGR_CROP : TAKE_PHOTO_LARGR);

                        } else {
                            Intent intent = new Intent(Intent.ACTION_PICK);
                            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                                    "image/*");
                            startActivityForResult(intent, needCrop ? PICK_PHOTO_ALBUM_CROP : PICK_PHOTO_ALBUM);
                        }
                    }

                    @Override
                    public void onPermissionCancel(Context context) {

                    }
                },
                Manifest.permission.CAMERA,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == TAKE_PHOTO_LARGR) {// 拍照, 不剪裁
                if (mSavePhotoPath != null) {
                    onPhotoPick(mSavePhotoPath);
                }
            }
            if (requestCode == PICK_PHOTO_ALBUM) {// 相册,不剪裁
                if (data != null) {
                    String filepath = ImagePicker.getFilepath(this, data.getData());
                    LOG.d("TAG", "Uri path = " + filepath);
                    onPhotoPick(filepath);
                }
            }
            if (requestCode == TAKE_PHOTO_LARGR_CROP) {// 拍照, 需要剪裁
                if (mSavePhotoPath != null) {
                    File file = new File(mSavePhotoPath);
                    Intent intent = ImagePicker.cropRawPhoto(this, Uri.fromFile(file));
                    startActivityForResult(intent, CROP_PHOTO);
                }
            }
            if (requestCode == PICK_PHOTO_ALBUM_CROP) {// 相册, 需要剪裁
                if (data != null) {
                    Uri uri = data.getData();
                    Intent intent = ImagePicker.cropRawPhoto(this, uri);
                    startActivityForResult(intent, CROP_PHOTO);
                }
            }
            if (requestCode == CROP_PHOTO) {
                if (data != null) {
//                    Bitmap bitmap = BitmapFactory.decodeFile(App.getPhotoCachePath() + "temp.jpg");
//                    onPhotoCrop(bitmap);
                    Bundle extras = data.getExtras();
                    if (extras != null) {
                        Bitmap bitmap = extras.getParcelable("data");
                        onPhotoCrop(bitmap);
                    }
                }
            }
        }
    }

    public void onPhotoPick(String filepath) {
        LOG.d("TAG", "onPhotoPick path = " + filepath);//在子类中获取照片路径
    }

    public void onPhotoCrop(Bitmap bitmap) {
        LOG.d("TAG", "onPhotoCrop bitmap = " + bitmap);//在子类中获取裁剪后照片路径
    }
}

public class ImagePicker {
	// 裁剪后图片的宽(X)和高(Y)。
	private static int output_X = 162;
	private static int output_Y = 161;

	/**
	 * 检测sd是否可用
	 * @return
	 */
	public static boolean sdExits() {
		String sdStatus = Environment.getExternalStorageState();
		if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { //
			return false;
		}
		return true;
	}

	/**
	 * 裁剪原始的图片
	 * @return
	 */
	public static Intent cropRawPhoto(Context context, Uri uri) {

		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		// 设置裁剪
		intent.putExtra("crop", "true");
		// aspectX , aspectY :宽高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX , outputY : 裁剪图片宽高
		intent.putExtra("outputX", output_X);
		intent.putExtra("outputY", output_Y);
		intent.putExtra("return-data", true);
		return intent;
	}

	/**
	 * 使用系统当前时间给图片命名
	 * @return
	 */
	public static String imageName() {
		new DateFormat();
		String name = DateFormat.format("yyyyMMdd_hhmmss",
				Calendar.getInstance(Locale.CHINA))
				+ ".jpg";
		return name;
	}

	public static String getFilepath(Context context, Uri uri) {
		String filepath = null;
		try {
			String[] proj = { MediaStore.Images.Media.DATA };
			Cursor cursor = ((Activity) context).getContentResolver().query(
					uri, proj, null, null, null);
			int column_index = cursor
					.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
			cursor.moveToFirst();
			filepath = cursor.getString(column_index);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return filepath;
	}
}
查看评论

Android调用系统相机和相册-坑篇

之前分享了Android调用系统相机和相册,但是由于国内Android机型繁多,各家都自己的room,调用系统的还是会出现不少问题: 一、拍照后照片被旋转 这种情况是使用Camera拍照以...
  • xjbclz
  • xjbclz
  • 2016-09-25 12:27:05
  • 2332

Android开发之调用相机拍照和调用系统相册

Android应用程序中调用相机进行拍照和选择相册中的照片是经常会使用到的,那么我们就来实现以下这个功能。首先创建一个工程CameraTest,布局文件一个ImageView,两个Button。 ...
  • xiaolaohuqwer
  • xiaolaohuqwer
  • 2016-07-30 09:05:42
  • 3262

Android 调用系统相机拍照、以及相册

  • 2015年04月11日 19:54
  • 2.09MB
  • 下载

Android 调用系统相机以及相册源码

Android 调用系统相机拍照、以及相册。完成之后图片是上传到app上。前面的功能已经测试过了。没有上传到服务器,因为我没服务器测试。但项目里面有个类可以参考上传图片到服务器,我就没测试了。接下来看...
  • qq_16064871
  • qq_16064871
  • 2015-04-12 08:44:13
  • 5435

Android 多媒体应用——调用系统相机和相册

有时朋友圈发一条状态,想要添加一张照片我们可以直接用相机拍摄,也可以直接在相册中选取上传,这就是用到了应用调用相机或者相册的功能。我们如何为应用添加这个功能呢?调用相机拍照  对于使用相机进行拍摄实现...
  • To_be_Designer
  • To_be_Designer
  • 2015-09-16 19:52:39
  • 2458

手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.0以后获取URI(兼容多版本)

Android中调用系统相机来拍摄照片的代码,如下: 1、首先设置Uri获取判断以及相机请求Code public final int TYPE_TAKE_PHOTO = 1;//Uri获取类型判...
  • u011150924
  • u011150924
  • 2017-05-15 14:18:43
  • 11303

Android调用系统相机和相册-填坑篇

上篇分享了Android调用系统相机和相册,但是由于国内Android机型繁多,各家都自己的rom,调用系统的还是会出现不少问题: 一、拍照照片被旋转 这种情况是使...
  • copy_yuan
  • copy_yuan
  • 2016-06-08 16:28:23
  • 888

调取相机相册

  • 2017年06月26日 16:31
  • 39.66MB
  • 下载

Android调用系统相机或相册更换头像

  • 2016年08月01日 11:50
  • 1.03MB
  • 下载

Android调用系统图库和相机获取图片并裁剪

1、获取权限   2、点击按钮来提示选择图库还是相机 private String[]mCustomItems=new String[]{"本地相册","相机拍照"}; //显示选择相机,图库...
  • m0_37930105
  • m0_37930105
  • 2017-08-02 15:20:41
  • 2865
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 555
    排名: 9万+
    文章分类