android-调用系统的ContentPrivder获取单张图片实现剪切做头像及源代码下载
首先讲述这个小项目的特色:
1、调用系统的相冊应用获取单张图片
2、对单张图片进行剪切方便做成指定大小的头像图片
3、对获取图片的结果进行解析,使用三种方式进行。
首先看看效果图:
打开app,进入注界面。点击获取图片button
调用系统的图片选择器,选择图库,
点击图片。返回获取到图片
点击剪切图片button,调用系统的图片剪切工具
获取到剪切之后的图片
以下详细请看代码:
public class MainActivity extends Activity implements OnClickListener{
private TextView backTx,sureTx;//一个返回键,一个确定键
private ImageView imageView;//显示获取的图片的ImageView
private Button getPic,getPic2Cut;
//两个button,分别实现获取图片、对图片进行剪切
private final int REQUEST = 11;//获取图片的请求值
private final int HEAD_IMAGE_ZOOM = 12;//图片剪切的请求值
private Uri uri;
private String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
init();
setclickListener();
}
private void init(){
backTx = (TextView) findViewById(R.id.cancle);
sureTx = (TextView) findViewById(R.id.ok);
imageView = (ImageView) findViewById(R.id.image);
getPic = (Button) findViewById(R.id.get_pic);
getPic2Cut = (Button) findViewById(R.id.get_pic_to_cut);
}
private void setclickListener(){
backTx.setOnClickListener(this);
sureTx.setOnClickListener(this);
getPic.setOnClickListener(this);
getPic2Cut.setOnClickListener(this);
}
//调用系统相冊获取图片的方法,很easy
private void loadData(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, REQUEST);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.cancle:
finish();
break;
case R.id.ok:
Toast.makeText(MainActivity.this, "图片已经获取到", Toast.LENGTH_SHORT).show();
break;
case R.id.get_pic:
loadData();
break;
case R.id.get_pic_to_cut:
startPhotoZoom(uri);
break;
}
}
@SuppressWarnings("deprecation")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST && resultCode == RESULT_OK) {
uri = data.getData();
/**
* 方法一:
* 直接使用ImageView的方法设置图片地址URI就可以。
* 只是这样的方式当图片很大的时候,easy出现OOM异常。慎用!
*/
imageView.setImageURI(uri);
/**
* 方法二:
* 依据获取的URI进行查询,获取到图片后进行缩放,不会出现OOM异常
*/
Cursor cursor = managedQuery(uri, null, null, null, null);
if (cursor != null) {
Log.i(TAG, "记录数="+cursor.getCount());
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(Media.DATA);
String path = cursor.getString(index);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
imageView.setImageBitmap(bitmap);
}
}else {
Toast.makeText(MainActivity.this, "无法获取图片数据", Toast.LENGTH_SHORT).show();
}
/**
* 方法三:
* 因为managedQuery这种方法已经不再推荐使用
* 故使用CursorLoader类完毕查询操作
*/
CursorLoader cursorLoader = new CursorLoader(MainActivity.this,
uri, null, null, null, null);
Cursor cursor2 = cursorLoader.loadInBackground();
if (cursor2 != null) {
Log.i(TAG, "记录数="+cursor2.getCount());
if (cursor2.moveToFirst()) {
int index = cursor2.getColumnIndexOrThrow(Media.DATA);
String path = cursor2.getString(index);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
imageView.setImageBitmap(bitmap);
}
}else {
Toast.makeText(MainActivity.this, "无法获取图片数据", Toast.LENGTH_SHORT).show();
}
}else if (requestCode == HEAD_IMAGE_ZOOM && resultCode == RESULT_OK) {
Bundle bundle = data.getExtras();
if (bundle != null) {
Bitmap bitmap = bundle.getParcelable("data");
imageView.setImageBitmap(bitmap);
}else {
Toast.makeText(MainActivity.this, "图片剪切失败", Toast.LENGTH_SHORT).show();
}
}else if (requestCode == HEAD_IMAGE_ZOOM) {
Toast.makeText(MainActivity.this, "图片取消剪切", Toast.LENGTH_SHORT).show();
}
}
/**
* 调用系统的程序进行图片的剪切操作
* 获取指定大小的剪切图片,方便做成头像
* @param uri
*/
private void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 以下这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 80);
intent.putExtra("outputY", 80);
intent.putExtra("return-data", true);
startActivityForResult(intent, HEAD_IMAGE_ZOOM);
}
}
上面代码获取返回值的过程中,使用了三种方法,详细实现的时候仅仅是用一种方法就可以。推荐使用第三种方式。
值得一提的是。该小项目须要在配置文件里增加一下权限值:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
没有此权限则报错!
该小项目很有用。大部分app中都有获取用户头像、进行用户头像的设置的操作,所以大家能够參考,假设有什么不正确的地方,请大家积极留言交流,共同进步。谢谢~!【握手】
android-调用系统的ContentPrivder获取单张图片实现剪切做头像及源代码下载的更多相关文章
- android调用系统相机并获取图片
如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...
- android 调用系统相机拍照 获取原图
好吧,为了这个问题又折腾了一整天.之前在网上找来的方法,如果在onActivityResult中直接用data.getData()的方式来生成bitmap,其实获取的是拍照生成的缩略图!看看尺寸就 ...
- Android调用系统相机、自己定义相机、处理大图片
Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...
- Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...
- Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博
原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博 ...
- Android调用系统相册和拍照的Demo
最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...
- android调用系统的自定义裁剪后得到的图片不清晰,使用MediaStore.EXTRA_OUTPUT获取缓存下的清晰图片
在使用系统自带的剪切图片工具时,通常只能设置一些比较小的值,像 intent.putExtra("outputX", 320); intent.putExtra("out ...
- Android调用系统相机和相册并解决data为空,OOM,图片角度不对的问题
最近公司项目用到手机拍照的问题,好不容易在网上copy了一些代码,但是运行起来一大堆bug,先是三星手机上运行程序直接崩掉,debug了一下原来是onActivityResult中data返回为空,找 ...
- android - 调用系统分享功能分享图片
step1: 编写分享代码, 将Uri的生成方式改为由FileProvider提供的临时授权路径,并且在intent中添加flag 注意:在Android7.0之后,调用系统分享,传入URI的时候可能 ...
随机推荐
- Linux之常用Shell脚本总结
一.简介本文将总结一些常用的shell脚本,方便以后工作中使用. 二.shell脚本[a]定期备份mysql数据库,需结合cronb定时任务调度实现. #!/bin/bash#首先声明一些自定义变量 ...
- P2257 YY的GCD (莫比乌斯反演)
题意:求\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = prim]\] 题解:那就开始化式子吧!! \[f(d) = \sum_{i=1}^{n}\sum_{j=1 ...
- JSON parse error: Can not construct instance of model.Class: no suitable constructor found
reference:http://blog.csdn.net/qq_33642117/article/details/51909346 当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函 ...
- python+Eclipse+pydev环境搭建1
编辑器: Eclipse + pydev插件 1. Eclipse是写JAVA的IDE, 这样就可以通用了,学习代价小. 学会了Eclipse, 以后写Python或者JAVA 都可以. 2. Ec ...
- 基于HLS(HTTP Live Streaming)的视频直播分析与实现
转自:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HLS(HTTP Live Streaming)的分析: HTT ...
- Oracle批量更新数据,使用begin end
/* 使用begin end批量更新 注意end后面必须使用;结束 并且每条update语句都要用;来结束 所以close为;END; 是为了补全语法 */ <foreach collectio ...
- Jenkins中部署Sonar代码检查
1 安装并启动sonarqube docker pull sonarqube:7.5-community docker run \ --name sonarqube \ --network ci \ ...
- Django中对接第三方支付(支付宝)实现支付的流程
1. 业务逻辑准备 1. 使用沙箱提供的商家环境 沙箱环境:是支付宝提供给开发者的模拟支付的环境 沙箱应用:https://docs.open.alipay.com/200/105311 沙箱账号:h ...
- NFS共享存储服务部署
第1章 NFS介绍 1.1 NFS基本概述 NFS(Network File System)网络文件系统 主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录. NFS系统和Windows网络 ...
- C语言程序内存分布
一个进程的数据在内存中的布局如下图: bss段(bss segment):可读可写不可执行,通常用来存放程序中未初始化的全局变量.bss是英文Block Started by Symbol的简称.b ...