最近实现一个功能,实现拍照的图片或者图库中的图片向服务器后台上传数据,拍照图片实现还好,可是图库中的图片一直获取不到文件,现在记录一下自己的坑。

我的代码实现

 //从相册选择    private void choseHeadImageFromGallery() {        Intent intentFromGallery = new Intent();        intentFromGallery.setType("image/*");//选择图片        intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);        startActivityForResult(intentFromGallery,CODE_GALLERY_REQUEST); }//打开相机选择    private void choseHeadImageFromCameraCapture() {        Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,photo);        startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);    }@Override    public void onActivityResult(int requestCode, int resultCode,                                    Intent intent) {        if (resultCode == RESULT_CANCELED) {            Toast.makeText(getActivity(), "取消", Toast.LENGTH_LONG).show();            return;        }        switch (requestCode) {            case CODE_GALLERY_REQUEST:  //图库                if(intent!=null){                   Uri uri = intent.getData();                    String path=uri.getPath();                    Bitmap bitmap =null;                //修改之后 关键这里,是获取到bitmap                    try {                        bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);                    } catch (IOException e) {                        e.printStackTrace();                    }                    if(bitmap!=null)                    ImageTools.savePhotoToSDCard(bitmap,Environment.getExternalStorageDirectory().getAbsolutePath(), "image");                    img.setScaleType(ImageView.ScaleType.CENTER_CROP);                    img.setImageURI(uri);                }                break;            case CODE_CAMERA_REQUEST:  //相机                if (intent != null) {                  Bitmap bitmap=intent.getParcelableExtra("data");                  img.setImageBitmap(bitmap);                  img.setScaleType(ImageView.ScaleType.CENTER_CROP);                    ImageTools.savePhotoToSDCard(bitmap,Environment.getExternalStorageDirectory().getAbsolutePath(), "image");                }                break;        } }

其中最主要的是下面两句
Uri uri = intent.getData();String path=uri.getPath();
我刚开始一直以为uri.getPath()可以直接拿到相片的文件地址信息,然后打印出来的却是
content://media/external/images/media/801893 (uri.toString)
/external/images/media/801893 (uri.getPath())
然后就突然意识到这个就是Uri 标准格式,原来从图库中返回的是Uri,但是具体细节忘记了,现在重新复习一下Uri知识

Uri的基本格式

scheme://host:port/[ path| pathPrefix| pathPattern]

Scheme: Uri的模式,比如 http,file,content如果不指定scheme,那么这个Uri其他的参数也无效

Host:Uri的主机名,比如 www.baidu.com 如果host未指定,Uri无效

Port: Uri的端口号,比如80

Path: 完整的路径信息

pathPattern: 也表示完整的路径信息,但是它里面的可以包含通配符”*”

pathPrefix: 表示路径前缀信息

Uri与Path的区别

以手机中的一张图为例
Uri:content://media/external/images/media/75935
Path:/storage/emulated/0/DCIM/Camera/1450768509653.jpg
通过观察数据库,可以帮助理解Uri的意义
!图片
images位于external.db
Uri中path就是数据库中的ID信息

更多相关文章

  1. Android(安卓)Studio 入门:(五) 悬浮按钮增加联系人信息
  2. android BitmapFactory.Options参数介绍
  3. OkHttpClient加载图片给DisposableObserver,CompositeDisposable
  4. android实现桌面icon未读信息图标(类似与iPhone的badge)
  5. Android:异步加载网络资源
  6. Android自定义圆形图片
  7. Android中使用fresco加载图片
  8. Android绘制圆形图片的3个方法
  9. android使用百度地图SDK获取定位信息示例

随机推荐

  1. 【Android的从零单排开发日记】之入门篇(
  2. 新书内容连载(3):Android(安卓)SDK中常用命
  3. android流媒体播放器
  4. 深度了解Flutter APP的构建流程
  5. 饭后Android(安卓)第六餐-Bmob云后端(Bmob
  6. Android(安卓)***测试学习手册(二)准备实验
  7. android studio 插件 - .ignore
  8. ubuntu16.04 compile android L error
  9. Android(安卓)之美 从0到1 之Android(安
  10. android 设置主页面的方式