版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中实现选择相册照片并返回功能
这篇文章将为大家详细讲解有关怎么在Android中实现选择相册照片并返回功能,文章内容质量较高,因此在下分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先由于进行读写操作,要在AndroidManifest.xml中声明权限:<uses-permission
android:name=“android.permission.READ_EXTERNAL_STORAGE”
/>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
/>调用系统相册:private
static
final
int
CHOOSE_PHOTO=0;
Intent
intent
=
new
Intent(“ent.action.GET_CONTENT”);
intent.setType(”image/*”);
startActivityForResult(intent,
CHOOSE_PHOTO);
[java]
view
plain
copy
private
static
final
int
CHOOSE_PHOTO=0;
Intent
intent
=
new
Intent("ent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,
CHOOSE_PHOTO);然后回调:@Override
protected
void
onActivityResult(int
requestCode,
int
resultCode,
Intent
data)
{
switch
(requestCode)
{
case
CHOOSE_PHOTO:
if
(resultCode
==
RESULT_OK)
{
Bitmap
bitmap
=
null;
//判断手机系统版本号
if
(Build.VERSION.SDK_INT
>=
19)
{
//4.4及以上系统使用这个方法处理图片
bitmap
=
ImgUtil.handleImageOnKitKat(this,
data);
//ImgUtil是自己实现的一个工具类
}
else
{
//4.4以下系统使用这个方法处理图片
bitmap
=
ImgUtil.handleImageBeforeKitKat(this,
data);
}
ImageView
view
=
(ImageView)
findViewById(R.id.personal_info_header_img);
view.setImageBitmap(bitmap);
}
break;
default:
break;
}
}@Override
protected
void
onActivityResult(int
requestCode,
int
resultCode,
Intent
data)
{
switch
(requestCode)
{
case
CHOOSE_PHOTO:
if
(resultCode
==
RESULT_OK)
{
Bitmap
bitmap
=
null;
//判断手机系统版本号
if
(Build.VERSION.SDK_INT
>=
19)
{
//4.4及以上系统使用这个方法处理图片
bitmap
=
ImgUtil.handleImageOnKitKat(this,
data);
//ImgUtil是自己实现的一个工具类
}
else
{
//4.4以下系统使用这个方法处理图片
bitmap
=
ImgUtil.handleImageBeforeKitKat(this,
data);
}
ImageView
view
=
(ImageView)
findViewById(R.id.personal_info_header_img);
view.setImageBitmap(bitmap);
}
break;
default:
break;
}
}将对图像的相关操作封装成一个ImgUtil类,便于使用:import
android.annotation.TargetApi;
import
android.content.ContentUris;
import
android.content.Context;
import
android.content.Intent;
import
android.content.SharedPreferences;
import
android.database.Cursor;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
.Uri;
import
android.preference.PreferenceManager;
import
vider.DocumentsContract;
import
vider.MediaStore;
import
android.text.TextUtils;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
/**
*
Created
by
wbin
on
2016/3/22.
*/
public
class
ImgUtil
{
//4.4及以上系统使用这个方法处理图片
@TargetApi(19)
public
static
Bitmap
handleImageOnKitKat(Context
context,
Intent
data)
{
String
imagePath
=
null;
Uri
uri
=
data.getData();
if
(DocumentsContract.isDocumentUri(context,
uri))
{
//如果是document类型的Uri,则通过document
id处理
String
docId
=
DocumentsContract.getDocumentId(uri);
if
(“viders.media.documents”.equals(uri.getAuthority()))
{
String
id
=
docId.split(”:”)[1];
//解析出数字格式的id
String
selection
=
MediaStore.Images.Media._ID
+
”=”
+
id;
imagePath
=
getImagePath(context,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
selection);
}
else
if
(“viders.downloads.documents”.equals(uri.getAuthority()))
{
Uri
contentUri
=
ContentUris.withAppendedId(
Uri.parse(”content://downloads/public_downloads”),
Long.valueOf(docId));
imagePath
=
getImagePath(context,
contentUri,
null);
}
}
else
if
(“content”.equalsIgnoreCase(uri.getScheme()))
{
//如果不是document类型的Uri,则使用普通方式处理
imagePath
=
getImagePath(context,
uri,
null);
}
return
getImage(imagePath);
}
//4.4以下系统使用这个方法处理图片
public
static
Bitmap
handleImageBeforeKitKat(Context
context,
Intent
data)
{
Uri
uri
=
data.getData();
String
imagePath
=
getImagePath(context,
uri,
null);
return
getImage(imagePath);
}
public
static
String
getImagePath(Context
context,
Uri
uri,
String
selection)
{
String
path
=
null;
//通过Uri和selection来获取真实的图片路径
Cursor
cursor
=
context.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;
}
//对bitmap进行质量压缩
public
static
Bitmap
compressImage(Bitmap
image)
{
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream();
press(Bitmap.CompressFormat.JPEG,
100,
baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int
options
=
100;
while
(baos.toByteArray().length
/
1024
>
100)
{
//循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
press(Bitmap.CompressFormat.JPEG,
options,
baos);//这里压缩options%,把压缩后的数据存放到baos中
options
-=
10;//每次都减少10
}
ByteArrayInputStream
isBm
=
new
ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap
bitmap
=
BitmapFactory.decodeStream(isBm,
null,
null);//把ByteArrayInputStream数据生成图片
return
bitmap;
}
//传入图片路径,返回压缩后的bitmap
public
static
Bitmap
getImage(String
srcPath)
{
if
(TextUtils.isEmpty(srcPath))
//如果图片路径为空
直接返回
return
null;
BitmapFactory.Options
newOpts
=
new
BitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds
设回true了
newOpts.inJustDecodeBounds
=
true;
Bitmap
bitmap
=
BitmapFactory.decodeFile(srcPath,
newOpts);//此时返回bm为空
newOpts.inJustDecodeBounds
=
false;
int
w
=
newOpts.outWidth;
int
h
=
newOpts.outHeight;
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float
hh
=
800f;//这里设置高度为800f
float
ww
=
480f;//这里设置宽度为480f
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int
be
=
1;//be=1表示不缩放
if
(w
>
h
&&
w
>
ww)
{//如果宽度大的话根据宽度固定大小缩放
be
=
(int)
(newOpts.outWidth
/
ww);
}
else
if
(w
<
h
&&
h
>
hh)
{//如果高度高的话根据宽度固定大小缩放
be
=
(int)
(newOpts.outHeight
/
hh);
}
if
(be
<=
0)
be
=
1;
newOpts.inSampleSize
=
be;//设置缩放比例
//重新读入图片,注意此时已经把options.inJustDecodeBounds
设回false了
bitmap
=
BitmapFactory.decodeFile(srcPath,
newOpts);
return
compressImage(bitmap);//压缩好比例大小后再进行质量压缩
}
}import
android.annotation.TargetApi;
import
android.content.ContentUris;
import
android.content.Context;
import
android.content.Intent;
import
android.content.SharedPreferences;
import
android.database.Cursor;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
.Uri;
import
android.preference.PreferenceManager;
import
vider.DocumentsContract;
import
vider.MediaStore;
import
android.text.TextUtils;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
/**
*
Created
by
wbin
on
2016/3/22.
*/
public
class
ImgUtil
{
//4.4及以上系统使用这个方法处理图片
@TargetApi(19)
public
static
Bitmap
handleImageOnKitKat(Context
context,
Intent
data)
{
String
imagePath
=
null;
Uri
uri
=
data.getData();
if
(DocumentsContract.isDocumentUri(context,
uri))
{
//如果是document类型的Uri,则通过document
id处理
String
docId
=
DocumentsContract.getDocumentId(uri);
if
("viders.media.documents".equals(uri.getAuthority()))
{
String
id
=
docId.split(":")[1];
//解析出数字格式的id
String
selection
=
MediaStore.Images.Media._ID
+
"="
+
id;
imagePath
=
getImagePath(context,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
selection);
}
else
if
("viders.downloads.documents".equals(uri.getAuthority()))
{
Uri
contentUri
=
ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
Long.valueOf(docId));
imagePath
=
getImagePath(context,
contentUri,
null);
}
}
else
if
("content".equalsIgnoreCase(uri.getScheme()))
{
//如果不是document类型的Uri,则使用普通方式处理
imagePath
=
getImagePath(context,
uri,
null);
}
return
getImage(imagePath);
}
//4.4以下系统使用这个方法处理图片
public
static
Bitmap
handleImageBeforeKitKat(Context
context,
Intent
data)
{
Uri
uri
=
data.getData();
String
imagePath
=
getImagePath(context,
uri,
null);
return
getImage(imagePath);
}
public
static
String
getImagePath(Context
context,
Uri
uri,
String
selection)
{
String
path
=
null;
//通过Uri和selection来获取真实的图片路径
Cursor
cursor
=
context.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;
}
//对bitmap进行质量压缩
public
static
Bitmap
compressImage(Bitmap
image)
{
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream();
press(Bitmap.CompressFormat.JPEG,
100,
baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int
options
=
100;
while
(baos.toByteArray().length
/
1024
>
100)
{
//循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
press(Bitmap.CompressFormat.JPEG,
options,
baos);//这里压缩options%,把压缩后的数据存放到baos中
options
-=
10;//每次都减少10
}
ByteArrayInputStream
isBm
=
new
ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap
bitmap
=
BitmapFactory.decodeStream(isBm,
null,
null);//把ByteArrayInputStream数据生成图片
return
bitmap;
}
//传入图片路径,返回压缩后的bitmap
public
static
Bitmap
getImage(String
srcPath)
{
if
(TextUtils.isEmpty(srcPath))
//如果图片路径为空
直接返回
return
null;
BitmapFactory.Options
newOpts
=
new
Bit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 8 Countries around the world Lesson 47 公开课教学课件【七年级英语上册(冀教版)】
- Unit 7 Sports and good health Lesson 37 公开课教学课件【七年级英语下册(冀教版)】
- 市政工程促进城市生态平衡
- 市政工程促进城市环保合格
- 2024年省市地方性知识竞赛-福建知识竞赛笔试参考题库含答案
- 2024年生化化工药品技能考试-化学检验工笔试参考题库含答案
- 2024年物资行业技能鉴定考试-物资进货员(采购员)笔试参考题库含答案
- 2024年火电电力职业技能鉴定考试-用电监察员初级工笔试参考题库含答案
- 最喜欢的古风歌曲作文
- 2024年河南住院医师-河南住院医师超声医学科笔试参考题库含答案
- 2023年长江环保集团运营人员招聘(第一批)【90人】历年高频难易度、易错点模拟试题(共500题)附带答案详解
- 上海大学继续教育学院2023《传统养生》平时作业+期末大作业答案
- 中华武术智慧树知到课后章节答案2023年下宁波大学
- 中考物理复习备考讲座廉锋
- 义务教育均衡发展基本办学条件标准 (明白纸)义务教育均
- 装饰装修工程施工单位自检表格(检验批)汇编
- 生活垃圾清运及保洁服务项目投标书.doc
- 科教版四年级下册科学期中试卷及答案
- 高中数学讲义微专题94《极坐标与参数方程》讲义
- 高级英语(第三版)第二册第五课TheSadYoungMen.ppt
- 欧姆龙PLC CP1E的中文手册
评论
0/150
提交评论