簡介:
感覺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/80609472File 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.txtD:/workspace/test/./test1.txt-----默認絕對路徑:取得路徑相同------D:/workspace/test/test1.txtD:/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.txtD:/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;
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答