안드로이드에서 개발을 하다보면 Uri를 비교하거나 해당 Uri를 사용해야할때가 있습니다. 예를 들어 WebView에서 WebViewClient의 shouldOverrideUrlLoading으로 로드되는 Url을 비교하거나 ContentProvider로 들어온 Uri를 체크할때가 바로 이때입니다. 이경우 조건문으로 해당값을 비교할수도 있지만 안드로이드에서 지원하는 UriMatcher를 이용하여 해당값을 비교할수도 있습니다.

private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
URI 트리의 루트 노드를 생성합니다. 루트노드는 공백의 uri를 match할경우 루트 노드값이 나옵니다. 매개변수로 넣는 코드는 UriMatcher.NO_MATCH를 사용하는것이 좋습니다.

Uri는 위의 그림처럼 구성되있으면 2번과 3번부분을 authority와 path라고 부릅니다. addURI메서드를 이용하여 authority와 path 그리고 code 값을 넣습니다. 이때 code 값은 match() 메소드 사용 시 일치한다면 반환하는 정수를 의미합니다.
sURIMatcher.addURI("contacts", "people", PEOPLE);
sURIMatcher.addURI("contacts", "people/#", PEOPLE_ID);
sURIMatcher.addURI("contacts", "people/#/phones", PEOPLE_PHONES);
sURIMatcher.addURI("contacts", "phones/filter/*", PHONES_FILTER);
이렇식으로 사용할수 있으며 path/# 는 path 다음에 오는 모든 숫자를 지칭하며, path/* 의 경우 숫자와 문자를 포함 합니다.
addURI로 등록된 URI와 입력된 URI를 비교하여 지정된 code를 리턴합니다. 없을겨우 -1(UriMatcher.NO_MATCH)를 반환합니다.
내부는 이런식으로 생성자, Uri조건을 추가하는 메서드, Uri를 집어넣어 해당Uri와 매칭되는것있는지 확인하는 메서드들로 구현되있습니다.
public class MyUriMatcher {
// 예시를 위한 상수 정의
private static final String AUTHORITY = "com.example.myapp.provider";
private static final String PATH_USERS = "users";
private static final String PATH_USER_ID = "users/#";
// 각각의 URI 패턴에 대한 정수 상수 정의
private static final int USERS = 1;
private static final int USER_ID = 2;
// UriMatcher 인스턴스 생성
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
// users 패턴에 대한 매칭 추가
sUriMatcher.addURI(AUTHORITY, PATH_USERS, USERS);
// users/# 패턴에 대한 매칭 추가
sUriMatcher.addURI(AUTHORITY, PATH_USER_ID, USER_ID);
}
// URI에 대한 작업을 수행하는 메서드
public static int match(Uri uri) {
return sUriMatcher.match(uri);
}
}
public class Main {
public static void main(String[] args) {
// 예시 URI 생성
Uri usersUri = Uri.parse("content://com.example.myapp.provider/users");
Uri userUri = Uri.parse("content://com.example.myapp.provider/users/123");
// UriMatcher를 사용하여 URI를 매치
int matchUsers = MyUriMatcher.match(usersUri);
int matchUser = MyUriMatcher.match(userUri);
// 매치된 결과 출력
System.out.println("Match for users URI: " + matchUsers); // 결과: 1 (USERS)
System.out.println("Match for user URI: " + matchUser); // 결과: 2 (USER_ID)
}
}
이런식으로 사용할수있습니다.
reference
https://developer.android.com/reference/android/content/UriMatcher
https://shnoble.tistory.com/62