当前位置: 移动技术网 > 移动技术>移动开发>Android > Android开发实现从相册中选择照片功能详解

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

2019年07月23日  | 移动技术网移动技术  | 我要评论

本文实例讲述了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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网