本文实例讲述了android开发实现从相册中选择照片功能。分享给大家供大家参考,具体如下:

实际效果图:

d4e90b458512cafc7c0e979af32ac7e1.png

代码实现:

1. 权限配置

2. 点击事件绑定

3. 相册访问

4. 根据路径设置图片

5. 其他方法

权限

首先,现在 mainfest.xml 文件中添加以下权限:

点击事件

点击跳转相册

imageview01.setonclicklistener(new view.onclicklistener() {

@override

public void onclick(view v) {

if(contextcompat.checkselfpermission(mainactivity.this,

manifest.permission.write_external_storage) != packagemanager.permission_granted){

activitycompat.requestpermissions(mainactivity.this,new string[]{

manifest.permission.write_external_storage

},1);

}

intent intent = new intent(intent.action_pick,

android.provider.mediastore.images.media.external_content_uri);

startactivityforresult(intent, image_request_code);

}

});

不同手机返回图片uri不同,此处进行转换

可以不添加( 如果,不添加,则其他方法也没用 )

@targetapi(19)

private void handleimageomkitkat(intent data){

string imagepath = null;

uri uri = data.getdata();

if (documentscontract.isdocumenturi(this,uri)){

//如果document类型是u日,则通过document id处理

string docid = documentscontract.getdocumentid(uri);

if ("com.android.providers.media.documents".equals(uri.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.providers.downloads.documents".equals(uri.getauthority())){

uri contenturi = contenturis.withappendedid(uri.parse("content://downloads/public_downloads"),long.valueof(docid));

imagepath = getimagepath(contenturi,null);

}

}else if ("content".equalsignorecase(uri.getscheme())){

//如果是普通类型 用普通方法处理

imagepath = getimagepath(uri,null);

}else if ("file".equalsignorecase(uri.getscheme())){

//如果file类型位uri直街获取图片路径即可

imagepath = uri.getpath();

}

displayimage(imagepath);

}

关于方法:onactivityresult()

在这里通过放回路径设置头像,但由于图片路径生成可能有一定延时,所以这里开一个线程等待:

/*定义一个handler,定义延时执行的行为*/

public void chnage(){

new thread(){

@override

public void run() {

while ( bitmap == null ){

bitmap = bitmapfactory.decodefile(path);

log.v("qwe","123");

}

message message = handler.obtainmessage();

message.obj = 0;

handler.sendmessage(message);

}

}.start();

}

其他方法:

private void handleimagebeforekitkat(intent data){

uri uri = data.getdata();

string imagepath = getimagepath(uri,null);

displayimage(imagepath);

}

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;

}

private void displayimage(string imagepath){

if (imagepath != null){

bitmap bitmap = bitmapfactory.decodefile(imagepath);

imageview01.setimagebitmap(bitmap);

}else {

toast.maketext(mainactivity.this,"fail to get image",toast.length_short).show();

}

}

相关变量:

//从相册获得图片

bitmap bitmap;

//判断返回到的activity

private static final int image_request_code = 0;

//图片路径

private string path ;

private handler handler = new handler(){

@override

public void handlemessage(message msg) {

if((integer)msg.obj==0){

imageview01.setimagebitmap(bitmap);

}

super.handlemessage(msg);

}

};

demo源码点击此处本站下载。

希望本文所述对大家android程序设计有所帮助。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐