Android中Bitmap、File与Uri之间的简单记录
简介:
感觉Uri、File、bitmap比较混乱,这里进行记载,方便以后查看.下面话不多说了,来一起看看详细的介绍吧
Bitmap、File与Uri
1、将一个文件路径path转换成File
Stringpath; Filefile=newFile(path)
2、讲一个Uri转换成一个path
以选择一张图片为例:
Stringpath=FileTools.getRealPathFromUri(content,uri); //自定义方法在下面 publicstaticStringgetRealPathFromUri(Contextcontext,Uriuri){ if(null==uri)returnnull;//传入的Uri为空,结束方法 finalStringscheme=uri.getScheme();//得到Uri的scheme StringrealPath=null; if(scheme==null) realPath=uri.getPath();//如果scheme为空 elseif(ContentResolver.SCHEME_FILE.equals(scheme)){ realPath=uri.getPath();//如果得到的scheme以file开头 }elseif(ContentResolver.SCHEME_CONTENT.equals(scheme)){ //得到的scheme以content开头 Cursorcursor=context.getContentResolver().query(uri, newString[]{MediaStore.Images.ImageColumns.DATA}, null,null,null); if(null!=cursor){ if(cursor.moveToFirst()){ intindex=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); if(index>-1){ realPath=cursor.getString(index); } } cursor.close();//必须关闭 } } //经过上面转换得到真实路径之后,判断一下这个路径,如果还是为空的话,说明有可能文件存在于外置sd卡上,不是内置sd卡. if(TextUtils.isEmpty(realPath)){ if(uri!=null){ StringuriString=uri.toString(); intindex=uriString.lastIndexOf("/");//匹配/在一个路径中最后出现位置 StringimageName=uriString.substring(index); //通过得到的最后一个位置,然后截取这个位置后面的字符串,这样就可以得到文件名字了 FilestorageDir; storageDir=Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES);//查看外部储存卡公共照片的文件 Filefile=newFile(storageDir,imageName); //自己创建成文件, if(file.exists()){ realPath=file.getAbsolutePath(); }else{ ////那么存储在了外置sd卡的应用缓存file中 storageDir=context.getExternalFilesDir(Environment.DIRECTORY_PICTURES); Filefile1=newFile(storageDir,imageName); realPath=file1.getAbsolutePath(); } } } returnrealPath; 比如我在android8.0上运行的时候 选择照片之后的Uri:content://media/external/images/media/568344 进行上面方法转换完之后:/storage/emulated/0/com.appben.appche/browser-photos/1550297407488.jpg }
3、File转换成path
Stringpath=file.getPath();
将此抽象路径名转换为一个路径名字符串。所得到的字符串使用默认名称分隔符来分隔名称序列中的名称。Stringpath=file.getAbsolutePath();
如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与getPath()方法一样。如果此抽象路径名是空的抽象路径名,则返回当前用户目录的路径名字符串,
该目录由系统属性user.dir指定。否则,使用与系统有关的方式分析此路径名。
在UNIX系统上,通过根据当前用户目录分析某一相对路径名,可使该路径名成为绝对路径名。在MicrosoftWindows系统上,
通过由路径名指定的当前驱动器目录(如果有)来分析某一相对路径名,
可使该路径名成为绝对路径名;否则,可以根据当前用户目录来分析它。getCanonicalPath
规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,
这与调用getAbsolutePath()方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。
这通常涉及到从路径名中移除多余的名称(比如"."和"..")、分析符号连接(对于UNIX平台),以及
将驱动器名转换成标准大小写形式(对于MicrosoftWindows平台)。
表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式
。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。
同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。
下面是参看文章中提到的一个例子
https://blog.csdn.net/qq_39949109/article/details/80609472 Filefile=newFile(".\\test1.txt"); Filefile=newFile("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 Filefile=newFile("..\\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
Filefile=null; try{ file=newFile(newURI(uri.toString())); }catch(URISyntaxExceptione){ e.printStackTrace(); }
6、File转换成URI
URIuri=file.toURI();
7、Path转换成Uri
Uriuri=Uri.parse(path);
8、图片的Uri转Bitmap
Bitmapbitmap=BitmapFactory.decodeStream(contentResolver.openInputStream(uri))
9、File转到bitmap
Bitmapbitmap=BitmapFactory.decodeFile(file.getPath);//这个file要是真实路径创建的file
10、bitmap转file,可以理解为将bitmap进行保存.
//自己创建想要保存的文件的文件对象 BuffferedOutPutStreambos= newBufferedOutputStream(newFileOutputStream(file)); bos.flush; bos.close;
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。