Android中Uri和Path之间的转换的示例代码

 更新时间:2018年04月21日 15:35:57   作者:FoolishDev  
本篇文章主要介绍了Android中Uri和Path之间的转换的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Android中Uri和Path之间的转换

原因

调用系统拍照应用,拍照后要保存图片,那么我们需要指定一个存储图片路径的Uri。这就涉及到如何将file path转换为Uri。有时候我们还需要根据照片的路径得到照片的media Uri,那么又该如何转换呢?

Android Uri to Path

现在遇到的常规Uri有两种:

  1. 媒体文件的Uri是content://, 表示这是一个数据库数据。去数据库查询正常返回。
  2. 其他的文件Uri是file://, 表示这个是一个文件。这个uri是通过Uri.fromFile(File file)方法生成。

Media Uri To Path

在我简书中有一篇文章Android Uri to Path当中介绍了如何把从相册返回的Uri转换为Media Uri,然后再通过获得的Media Uri获取图片的Path。最终通过BitmapFractory创建相应的Bitmap对象。

File Uri To Path

这个转换相对比较简单,我们可以直接利用Android SDK提供的Uri.getPath()方法来获取相应的路径,然后利用Java IO来获取输入流,创建Bitmap。如果想直接通过File Uri获取输入流,我们可以通过调用ContentResolves.openInputStream(Uri uri)返回得到输入流。

bitmap = BitmapFactory.decodeStream(
          getContentResolver().openInputStream(
              GetImageUri.getImageStreamFromExternal("Screenshots/Screenshot.png"))
      );

这里的GetImageUri.getImageStreamFromExternal是我自己写的一个工具类:

public static Uri getImageStreamFromExternal(String imageName) {
    File externalPubPath = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES
    );

    File picPath = new File(externalPubPath, imageName);
    Uri uri = null;
    if(picPath.exists()) {
       uri = Uri.fromFile(picPath);
    }

    return uri;
  }

通过该静态方法可以将外部存储路径下的Pictures目录下的文件的路径转换为File Uri。

Android Path To Uri

File Path To File Uri

直接上代码:

public static Uri getImageStreamFromExternal(String imageName) {
    File externalPubPath = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES
    );

    File picPath = new File(externalPubPath, imageName);
    Uri uri = null;
    if(picPath.exists()) {
       uri = Uri.fromFile(picPath);
    }

    return uri;
  }

这里我们看到,最核心的部分就是利用Uri.fromFile()方法获取到指定路径的File Uri。

File Path To Media Uri

直接上代码:

public static Uri getMediaUriFromPath(Context context, String path) {
    Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = context.getContentResolver().query(mediaUri,
        null,
        MediaStore.Images.Media.DISPLAY_NAME + "= ?",
        new String[] {path.substring(path.lastIndexOf("/") + 1)},
        null);

    Uri uri = null;
    if(cursor.moveToFirst()) {
      uri = ContentUris.withAppendedId(mediaUri,
          cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
    }
    cursor.close();
    return uri;
  }

代码分析:首先我们获取到相册数据库表的Uri,mediaUri。然后我们利用ContentResolver.query()方法,并且selectionArgs传入根据指定路径获得的文件名来得到一个cursor对象。然后通过这个cursor对象我们获取到指定文件的ID。最后通过ContentUri组合mediaUri和图片的Id,得到最终的Media Uri。

MediaStore

这个类很重要,官方文档介绍:The Media provider contains meta data for all available media on both internal and external storage devices.意思大概是该类包含了所有在设备的内部存储和外部存储的媒体文件的元数据。例如通过指定MediaStore.ACTION_IMAGE_CAPTURE为action的Intent可以打开系统相机,MediaStore.EXTRA_OUTPUT是指定存储Uri的键...

渣渣英语翻译,见谅...总之这个类在访问媒体文件时很重要。

还有一些对应数据库表列名,android.provider.MediaStore.MediaColumns中DATA指的是文件路径,DISPLAY_NAME代表文件名...还有android.provider.BaseColumns中_ID就是媒体文件的ID。有需要用到时,可以查阅文档。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Flutter自定义下拉刷新时的loading样式的方法详解

    Flutter自定义下拉刷新时的loading样式的方法详解

    Flutter中的下拉刷新,我们通常RefreshIndicator,可以通过color或strokeWidth设置下拉刷新的颜色粗细等样式,但如果要自定义自己的widget,RefreshIndicator并没有暴露出对应的属性,那如何修改呢,文中给大家介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 详解如何在Android中实现悬浮Activity

    详解如何在Android中实现悬浮Activity

    本篇文章主要介绍详解如何在Android中实现悬浮Activity,通过修改Activity的实现来适配平板设备,已达到代码的最大利用率。有兴趣的可以了解一下。
    2017-01-01
  • Kotlin Suspend挂起函数的使用详解

    Kotlin Suspend挂起函数的使用详解

    这里介绍 Kotlin Suspend 挂起函数的使用。挂起(suspend)函数是所有协程的核心。 挂起函数可以执行长时间运行的操作并等待它完成而不会阻塞主线程。Kotlin 的 suspend 关键字可以帮助我们消除回调,用同步的写法写异步
    2023-02-02
  • Android画廊效果之ViewPager显示多个图片

    Android画廊效果之ViewPager显示多个图片

    这篇文章主要为大家详细介绍了Android画廊效果之ViewPager显示多个图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android抛物线下载动画制作过程

    Android抛物线下载动画制作过程

    这篇文章主要为大家详细介绍了Android抛物线下载动画制作过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android EditText常用属性功能汇总

    Android EditText常用属性功能汇总

    这篇文章主要介绍了Android EditText常用属性功能,较为详细的汇总分析了Android开发中EditText控件的常用属性的功能与具体用法,需要的朋友可以参考下
    2016-06-06
  • Android滑动优化高仿QQ6.0侧滑菜单(滑动优化)

    Android滑动优化高仿QQ6.0侧滑菜单(滑动优化)

    之前的实现只是简单的可以显示和隐藏左侧的菜单,但是特别生硬,而且没有任何平滑的趋势,那么今天就来优化一下吧,加上平滑效果,而且可以根据手势滑动的方向来判断是否是显示和隐藏
    2016-02-02
  • Android的Launcher启动器中添加快捷方式及小部件实例

    Android的Launcher启动器中添加快捷方式及小部件实例

    这篇文章主要介绍了在Android的Launcher启动器中添加快捷方式及窗口小部件的方法,包括在自己的应用程序中添加窗口小部件AppWidget的例子,需要的朋友可以参考下
    2016-02-02
  • Android使用自定义ImageView实现圆形图片效果

    Android使用自定义ImageView实现圆形图片效果

    本篇文章主要介绍了Android使用自定义ImageView实现圆形图片效果,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • http请求绕过Filter的实现实例

    http请求绕过Filter的实现实例

    这篇文章主要介绍了http请求绕过Filter的实现实例的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论