欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发实现从相册中选择照片功能详解

程序员文章站 2023-02-15 18:43:00
本文实例讲述了android开发实现从相册中选择照片功能。分享给大家供大家参考,具体如下: 实际效果图: 代码实现: 1. 权限配置 2. 点击事件绑定 3....

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

实际效果图:

Android开发实现从相册中选择照片功能详解

代码实现:

1. 权限配置
2. 点击事件绑定
3. 相册访问
4. 根据路径设置图片
5. 其他方法

权限

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

<!--获取照片权限-->
<uses-permission android:name="android.permission.read_external_storage"/>
<uses-permission android:name="android.permission.write_external_storage" />

点击事件

点击跳转相册

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相关内容感兴趣的读者可查看本站专题:《android图形与图像处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结

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