Android中Bitmap、File与Uri之间的简单记录

 更新时间:2019年02月28日 11:51:46   作者:难得糊涂与君勉  
这篇文章主要给大家介绍了关于Android中Bitmap、File与Uri之间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

简介:

感觉Uri 、File、bitmap 比较混乱,这里进行记载,方便以后查看.下面话不多说了,来一起看看详细的介绍吧

Bitmap、File与Uri

1、将一个文件路径path转换成File

String path ;
File file = new File(path)

2、讲一个Uri转换成一个path

以选择一张图片为例:

String path = FileTools.getRealPathFromUri(content,uri);
//自定义方法在下面
 public static String getRealPathFromUri(Context context, Uri uri) {

 if (null == uri) return null; //传入的Uri为空,结束方法

 final String scheme = uri.getScheme(); //得到Uri的scheme

 String realPath = null;

 if (scheme == null)
  realPath = uri.getPath(); //如果scheme为空 
 else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
  realPath = uri.getPath(); //如果得到的scheme以file开头
 } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
  //得到的scheme以content开头
  Cursor cursor = context.getContentResolver().query(uri,
   new String[]{MediaStore.Images.ImageColumns.DATA},
   null, null, null);
  if (null != cursor) {
  if (cursor.moveToFirst()) {
   int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
   if (index > -1) {
   realPath = cursor.getString(index);
   }
  }
  cursor.close(); //必须关闭
  }
 }
 
//经过上面转换得到真实路径之后,判断一下这个路径,如果还是为空的话,说明有可能文件存在于外置sd卡上,不是内置sd卡.
 if (TextUtils.isEmpty(realPath)) {
  if (uri != null) {
  
  String uriString = uri.toString();
  int index = uriString.lastIndexOf("/"); //匹配 / 在一个路径中最后出现位置

  String imageName = uriString.substring(index);
  //通过得到的最后一个位置,然后截取这个位置后面的字符串, 这样就可以得到文件名字了 

  File storageDir;

  storageDir = Environment.getExternalStoragePublicDirectory(
   Environment.DIRECTORY_PICTURES); //查看外部储存卡公共照片的文件

  File file = new File(storageDir, imageName);
  //自己创建成文件,

  if (file.exists()) {
   realPath = file.getAbsolutePath();
  } else {
//  //那么存储在了外置sd卡的应用缓存file中
   storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
   File file1 = new File(storageDir, imageName);
   realPath = file1.getAbsolutePath();
  }
  }
 }
 return realPath;

 

 比如我在android 8.0 上运行的时候
 选择照片之后的Uri : content://media/external/images/media/568344
 进行上面方法转换完之后: /storage/emulated/0/com.appben.appche/browser-photos/1550297407488.jpg
 

 }

3、File 转换成path

String path = file.getPath();
将此抽象路径名转换为一个路径名字符串。所得到的字符串使用默认名称分隔符来分隔名称序列中的名称。

String path = file.getAbsolutePath();
如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath() 方法一样。如果此抽象路径名是空的抽象路径名,则返回当前用户目录的路径名字符串,
该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式分析此路径名。
在 UNIX 系统上,通过根据当前用户目录分析某一相对路径名,可使该路径名成为绝对路径名。在 Microsoft Windows 系统上,
通过由路径名指定的当前驱动器目录(如果有)来分析某一相对路径名,
可使该路径名成为绝对路径名;否则,可以根据当前用户目录来分析它。

getCanonicalPath
规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,
这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。
这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、分析符号连接(对于 UNIX 平台),以及
将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。
表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式
。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。
同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。

下面是参看文章中提到的一个例子

https://blog.csdn.net/qq_39949109/article/details/80609472

File file = new File(".\\test1.txt");
File file = new File("D:\\workspace\\test\\test1.txt");
 System.out.println("-----默认相对路径:取得路径不同------");
 System.out.println(file1.getPath());
 System.out.println(file1.getAbsolutePath());
 System.out.println("-----默认绝对路径:取得路径相同------");
 System.out.println(file2.getPath());
 System.out.println(file2.getAbsolutePath());


结果是:
-----默认相对路径:取得路径不同------
.\test1.txt
D:\workspace\test\.\test1.txt
-----默认绝对路径:取得路径相同------
D:\workspace\test\test1.txt
D:\workspace\test\test1.txt


 File file = new File("..\\src\\test1.txt");
 System.out.println(file.getAbsolutePath());
 System.out.println(file.getCanonicalPath());
//得到的结果
D:\workspace\test\..\src\test1.txt
D:\workspace\src\test1.txt

4、URI 与Uri的区别

URI 是java.net的子类

Uri 是android.net的子类,Uri不能被实例化

5、URI 转换成 File

File file = null;
try{
 file = new File(new URI(uri.toString()));
}catch(URISyntaxException e){
 e.printStackTrace();
}

6、File 转换成URI

URI uri = file.toURI();

7、Path 转换成Uri

Uri uri = Uri.parse(path);

8、图片的Uri转Bitmap

Bitmap bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri))

9、File 转到bitmap

Bitmap bitmap = BitmapFactory.decodeFile(file.getPath); //这个file要是真实路径创建的file

10、bitmap 转 file,可以理解为将bitmap进行保存.

//自己创建想要保存的文件的文件对象
BuffferedOutPutStream bos = 
new BufferedOutputStream(new FileOutputStream(file));
bos.flush;
bos.close;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Android 倒影算法的实现代码

    Android 倒影算法的实现代码

    Android 倒影算法的实现代码,需要的朋友可以参考一下
    2013-05-05
  • Android 面试题汇总

    Android 面试题汇总

    本文主要介绍Android 面试题,这里整理了70道面试题和答案供大家学习参考,有需要的小伙伴可以参考下
    2016-09-09
  • Android QQ登录界面绘制代码

    Android QQ登录界面绘制代码

    这篇文章主要为大家详细介绍了Android QQ登录界面绘制代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 详解Android中BroadCastReceiver组件

    详解Android中BroadCastReceiver组件

    这篇文章主要为大家详细介绍了Android中BroadCastReceiver组件,Broadcast Receiver是Android的五大组件之一,使用频率也很高,用于异步接收广播Intent,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Android利用反射机制调用截屏方法和获取屏幕宽高的方法

    Android利用反射机制调用截屏方法和获取屏幕宽高的方法

    这篇文章主要介绍了Android利用反射机制调用截屏方法和获取屏幕宽高的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Android自定义实现BaseAdapter的普通实现

    Android自定义实现BaseAdapter的普通实现

    这篇文章主要为大家详细介绍了Android自定义实现BaseAdapter的普通实现,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android Flutter实现自由落体弹跳动画效果

    Android Flutter实现自由落体弹跳动画效果

    粒子运动是将对象按照一定物理公式进行的自定义轨迹运动,与普通动画不同的是,它没有强制性的动画开始到结束的时间概念。本文将利用Flutter实现自由落体弹跳动画效果,感兴趣的小伙伴可以学习一下
    2022-10-10
  • Android DrawerLayout带有侧滑功能的布局类(1)

    Android DrawerLayout带有侧滑功能的布局类(1)

    这篇文章主要为大家详细介绍了Android DrawerLayout带有侧滑功能的布局类,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android SQLite数据库版本升级的管理实现

    Android SQLite数据库版本升级的管理实现

    这篇文章主要介绍了Android SQLite数据库版本升级的管理实现的相关资料,这里提供实现代码帮助大家掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Android Git submodule详解用法示例

    Android Git submodule详解用法示例

    项目中经常会使用到第三方的 git 库, 将三方库整合到项目中最简单的办法就是复制粘贴, 但是如果这个库升级了一个很酷炫的功能, 你要怎么整合进来呢?(其实就是 git 版的包管理器)这就是本次要介绍的 git-submodule 操作, 直接把第三方的版本库合并到自己的库中
    2021-11-11

最新评论