一、Uri的概念
Uri,即Uniform Resource Identifier,統一資源標誌符,是Web上所有資源的唯一標識符。
在Android中,Uri可以代表不同的數據類型,如文件、圖片、音頻等。
Uri以字元串的形式存在,主要格式為:scheme://host:port/path?query#fragment。其中,scheme表示模式,如http、https等;host表示主機名;port表示埠號;path是主機名後面的部分;query表示查詢參數;fragment表示片段標識符。
二、Uri的使用方式
在Android開發中,Uri可以通過以下方式來使用:
1. 通過資源ID獲取Uri
Uri uri = Uri.parse("android.resource://packageName/" + R.raw.my_movie);
此處的「my_movie」為raw目錄下的文件名,packageName為當前應用程序的包名。
2.通過文件路徑獲取Uri
Uri uri = Uri.parse("file:///sdcard/my_image.jpg");
此處的「my_image.jpg」為文件名,/sdcard/為文件路徑。
3.通過ContentProvider獲取Uri
Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); Uri uri = Uri.parse("file://" + path); } cursor.close(); }
通過ContentResolver查詢圖片文件的Uri。
三、Uri的使用場景
1.用作Intent的數據
Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("http://www.example.com"); intent.setData(uri); startActivity(intent);
通過Uri打開網頁。
2.用作ContentProvider的數據
ContentProvider可以將存儲在SQLite資料庫、文件系統或Web上的數據暴露給其他應用程序。
//在MyContentProvider中的query方法中 Cursor cursor = db.query(tableName, projection, selection, selectionArgs, null, null, sortOrder); cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor;
通過Uri將MyContentProvider中的數據暴露出去。
3.用作圖片資源的地址
Glide.with(context) .load(Uri.parse("content://media/external/images/media/123")) .into(imageView);
通過Uri載入圖片。
四、Uri的注意事項
1.許可權問題
訪問文件系統需要申請訪問許可權,如讀寫外部存儲需要在Manifest中聲明Permission。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.Uri的編碼問題
Uri中可能包含一些特殊字元,如空格、&、#等,需要對這些字元進行編碼。
String encodedString = URLEncoder.encode(uriString, "UTF-8")
3.Uri的區分大小寫問題
Android中的Uri是區分大小寫的,相同的Uri如果大小寫不同,會被認為是不同的Uri。
4.Uri的空指針問題
在將字元串轉換為Uri時,需要進行非空判斷,避免出現空指針異常。
if (!TextUtils.isEmpty(uriString)) { Uri uri = Uri.parse(uriString); }
五、總結
Uri是Android中非常重要的一個概念,它在許多場合都有廣泛的應用。在使用Uri時,需要注意字元串的編碼、空指針異常、許可權問題等。我們需要在開發過程中靈活運用Uri,為我們的應用增添更多的功能和特性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/235575.html