使用Android系统相册,打开相册,选择图片,并裁剪图片,显示图片
访问内存静态权限:
<!--写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--读取数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>
实现代码:
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_CHOOSE_IMAGE = 1;
public static final int REQUEST_CODE_CROP_IMAGE = 2;
private ImageView picture;
private Uri iconUri;
private Uri cropImageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestAllPower();//获取动态权限
picture = (ImageView) findViewById(R.id.picture);
}
//按钮点击事件
public void click(View v) {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQUEST_CODE_CHOOSE_IMAGE);
}
//请求应用所需所有权限
public void requestAllPower() {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);
}
/**
* 裁减图片操作
*
* @param
*/
private void startCropImage(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 使图片处于可裁剪状态
intent.putExtra("crop", "true");
// 裁剪框的比例(根据需要显示的图片比例进行设置)
if (Build.MANUFACTURER.contains("HUAWEI")) {
//硬件厂商为华为的,默认是圆形裁剪框,这里让它无法成圆形
intent.putExtra("aspectX", 9999);
intent.putExtra("aspectY", 9998);
}else{
//其他手机一般默认为方形
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
}
// 设置裁剪区域的形状,默认为矩形,也可设置为圆形,可能无效
//intent.putExtra("circleCrop", true);
// 让裁剪框支持缩放
intent.putExtra("scale", true);
// 传递原图路径
File cropFile = new File(Environment.getExternalStorageDirectory() + "/crop_image.jpg");
try {
if (cropFile.exists()) {
cropFile.delete();
}
cropFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
cropImageUri = Uri.fromFile(cropFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, cropImageUri);
// 设置图片的输出格式
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
// return-data=true传递的为缩略图,小米手机默认传递大图,所以会导致onActivityResult调用失败
intent.putExtra("return-data", false);
startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (intent != null) {
switch (requestCode) {
// 将选择的图片进行裁剪
case REQUEST_CODE_CHOOSE_IMAGE:
if (intent.getData() != null) {
iconUri = intent.getData();
startCropImage(iconUri);
}
break;
case REQUEST_CODE_CROP_IMAGE:
if (resultCode == RESULT_OK) {
try {
Bitmap bitmap = BitmapFactory.decodeStream
(getContentResolver()
.openInputStream(cropImageUri));
picture.setImageBitmap(bitmap); // 将裁剪后的照片显示出来
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
}
在custom Phone 7.1.0 -API 25 genymotion模拟器上运行效果:
参考文章
Android之图片选择与裁剪(有一些错误):
http://juhonggang.github.io/2016/05/09/Android%E4%B9%8B%E5%9B%BE%E7%89%87%E9%80%89%E6%8B%A9%E4%B8%8E%E8%A3%81%E5%89%AA/
android.os.Build的一些使用方法
http://blog.csdn.net/ioiol/article/details/45535601
一种简单的写法,但不支持裁剪,亲测可用:
http://viralpatel.net/blogs/pick-image-from-galary-android-app/