package com.zenglb.framework.activity.setHeadImg;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.zenglb.baselib.base.BaseActivity;
import com.zenglb.baselib.utils.FileCachePathConfig;
import com.zenglb.baselib.utils.FileStorage;
import com.zenglb.framework.R;
import java.io.File;
/**
* 拍照或者从相册中选取照片,然后裁剪好;并显示裁剪好的照片
* <p>
* -- Warming --
* 2.请注意Android 6.0 后面的权限检查,请先去检查权限
* 3.测试要注意小于4.4 等于4.4 大于 4.4 5 6 7 来分别的测试
*/
public class SetHeadImgActivity extends BaseActivity implements View.OnClickListener {
private static final int REQUEST_PICK_IMAGE = 1; //相册选取
private static final int REQUEST_CAPTURE = 2; //拍照
private static final int REQUEST_PICTURE_CUT = 3; //剪裁图片
private ImageView iv;
private Button take_btn, album_btn;
private Uri imageUri; //拍照的原图保存地址
private String imagePath; //相册选择的原图地址
private Uri cropImgUri; //裁剪过的图片地址
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected int setLayoutId() {
return R.layout.activity_set_head_img;
}
protected void initViews() {
take_btn = (Button) findViewById(R.id.take_btn);
album_btn = (Button) findViewById(R.id.album_btn);
iv = (ImageView) findViewById(R.id.iv);
take_btn.setOnClickListener(this);
album_btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.take_btn:
openCamera();
break;
case R.id.album_btn:
selectFromAlbum();
break;
}
}
/**
* 打开系统相机
*/
private void openCamera() {
File file = new FileStorage(FileCachePathConfig.CACHE_IMAGE_CHILD).createTempFile("temp.jpg");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
imageUri = FileProvider.getUriForFile(SetHeadImgActivity.this, "com.zenglb.framework.fileprovider", file);//通过FileProvider创建一个content类型的Uri
} else {
imageUri = Uri.fromFile(file);
}
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
}
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //设置Action为拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //将拍取的照片保存到指定URI
startActivityForResult(intent, REQUEST_CAPTURE);
}
/**
* 从相册选择
*/
private void selectFromAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQUEST_PICK_IMAGE);
}
/**
* 裁剪相片
*/
private void cropPhoto() {
File file = new FileStorage(FileCachePathConfig.CACHE_IMAGE_CHILD).createTempFile("temp.jpg");
cropImgUri = Uri.fromFile(file);//缩略图保存地址
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 400);
intent.putExtra("outputY", 400);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, cropImgUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, REQUEST_PICTURE_CUT);
}
private void handleImageBeforeKitKat(Intent intent) {
imageUri = intent.getData();
imagePath = getImagePath(imageUri, null);
cropPhoto();
}
@TargetApi(19)
private void handleImageOnKitKat(Intent data) {
if (data == null || data.getData() == null) {
Toast.makeText(this, "你放弃了操作", Toast.LENGTH_SHORT).show();
return;
}
imagePath = null;
imageUri = data.getData();
if (DocumentsContract.isDocumentUri(this, imageUri)) {
//如果是document类型的uri,则通过document id处理
String docId = DocumentsContract.getDocumentId(imageUri);
if ("com.android.providers.media.documents".equals(imageUri.getAuthority())) {
String id = docId.split(":")[1];//解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.downloads.documents".equals(imageUri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
} else if ("content".equalsIgnoreCase(imageUri.getScheme())) {
//如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(imageUri, null);
} else if ("file".equalsIgnoreCase(imageUri.getScheme())) {
//如果是file类型的Uri,直接获取图片路径即可
imagePath = imageUri.getPath();
}
cropPhoto();
}
/**
* @param uri
* @param selection
* @return
*/
private String getImagePath(Uri uri, String selection) {
String path = null;
//通过Uri和selection老获取真实的图片路径
Cursor cursor = 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;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_PICK_IMAGE://从相册选择
if (Build.VERSION.SDK_INT >= 19) {
handleImageOnKitKat(data);
} else {
handleImageBeforeKitKat(data);
}
break;
case REQUEST_CAPTURE://拍照
if (resultCode == RESULT_OK) {
cropPhoto();
}
break;
case REQUEST_PICTURE_CUT://裁剪完成
if (cropImgUri == null) {
Toast.makeText(mContext, "cropImgUri == null", Toast.LENGTH_SHORT).show();
}
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(cropImgUri));
iv.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
/**
*
*/
protected void onDestroy() {
super.onDestroy();
}
}