Android에서 자체 URI 체계를 구현하는 방법


161

다음과 같은 URI를 정의하고 싶다고 가정 해보십시오.

myapp://path/to/what/i/want?d=This%20is%20a%20test

내 자신의 응용 프로그램 또는 서비스에서 처리해야합니다. 계획임을 주목 "myapp"하지 "http", 나 "ftp". 그것은 정확히 내가 의도 한 것입니다 : Android OS에 대해 내 자신의 URI 스키마를 전역 적으로 정의합니다. 이게 가능해?

이는 Skype ( skype://) 또는 토렌트 다운로더 프로그램 ( torrent://) 과 같은 Windows 시스템과 같은 일부 프로그램에서 이미 수행 한 작업과 다소 유사합니다 .


답변:


215

이것은 매우 가능합니다. <data>요소를 사용하여 AndroidManifest.xml에 URI 스킴을 정의하십시오 . <data>요소가 채워진 인 텐트 필터를 설정하면 고유 한 구성표를 만들 수 있습니다. ( 의도 필터 및 의도 해결에 대한 자세한 내용은 여기를 참조하십시오 .)

다음은 간단한 예입니다.

<activity android:name=".MyUriActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" android:host="path" />
    </intent-filter>
</activity>

암시 적 의도의 작동 방식에 따라 하나 이상의 작업과 범주도 정의해야합니다. 여기에서 VIEW를 조치로 선택하고 (아무것이든 가능하지만) DEFAULT 카테고리를 추가하십시오 (모든 암시 적 의도에 필요하므로). 또한 BROWSABLE 카테고리를 추가 한 방법에 주목하십시오-이것은 필수는 아니지만 브라우저에서 URI를 열 수 있습니다 (멋진 기능).


11
"android : path"변수가 프로토콜 다음에 모든 것을 지정해야하는 특정 경로에 연결하는 데 시간이 걸렸습니다. "youtube.com/myvideo"형식이어야합니다
Casebash

2
잘 작동하지만 MyUriActivity에서 URL에 제공된 GET 매개 변수 "d"의 값을 어떻게 읽을 수 있습니까?
Timo

나를 위해 작동하지 않는 동일한 활동에 대해 여러 의도 필터가 있습니다. 메인 런처 용. 위와 같이 특정 파일을 세 번째 열기위한 두 번째 첫 번째 두 번째는 완벽하게 작동하지만 세 번째는 아닙니다.
mohitum

여기에서 질문을 볼 수 있습니까? stackoverflow.com/q/29116574/3828908
Salmaan

1
누군가가 필요할 경우를 대비하여 위의 링크의 영어 버전 .
Zensaburou

68

@DanielLew 답변을 보완하여 매개 변수의 값을 얻으려면 다음을 수행하십시오.

URI 예 : myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

당신의 활동에서 :

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}

링크가 같다면 http://www.host.com/directory/value? 우리는 이것을 어떻게 얻을 수 value있습니까?
버그는

3
걱정 마세요, 여기에 SO 답변이 있습니다 .
버그는

메타 데이터를 사용하지 않고 코드에서 AndroidManifest.xml의 데이터 태그를 읽는 방법 oauth 호출에서 서버에 정확한 구성표, 경로 및 호스트를 보내야합니다. 콜백 선언을 복제하고 싶지 않습니다!
Pradeep Chakravarti Gudipati

@BugsHappen 마지막 URI 경로 세그먼트입니다. 사용uri.getLastPathSegment();
Martin

25

자신의 계획을 정의하지 않는 것이 좋습니다. 이는 URI 스킴에 대한 웹 표준에 위배되며, 이는 다른 엔티티 간의 이름 충돌을 피하기 위해 적절한 이유로 해당 이름을 엄격하게 제어하려고 시도합니다. 웹 사이트에 구성표에 대한 링크를 넣으면 전체 인터넷 네임 스페이스 전체에 작은 이름을 넣었으므로 해당 표준을 따라야합니다.

자신의 앱에 대한 링크를 원할 경우 여기에 설명 된 접근 방식을 따르는 것이 좋습니다.

Android OS의 브라우저에서 URL을 호출하여 프로그램에 액세스하기 위해 일부 URL 네임 스페이스 (myapp : //app.start/)를 등록하는 방법은 무엇입니까?


2
고마워하지만 닫힌 환경에서 개념을 증명하기 위해 이것을 사용하려고합니다. 이 실험이 테스트 단계를 벗어나면 모든 거래를 비준하는 것이 좋습니다.
punnie

5
좋아 ... 근데 왜 옳은 일을하지? 더 이상 일하지 않습니다.
hackbod

2
유튜브는 @hackbod가 제안하는 것을 수행 하지만 페이스 북에서 유튜브 링크를 열면 유튜브 앱이 아닌 브라우저가 열립니다. 이 메커니즘이 너무 "전달"됩니까?
AlikElzin-kilaka

19
동일한 웹 로직을 사용하여 iOS 앱 또는 Android 앱을 시작할 수 있도록 자체 구성표를 정의하려고합니다. 그냥 내 2 센트
Chicowitz

1
@ hackbod 나는 그들이 rfc를 쓸 때 그들이 안드로이드를 염두에두고 있다고 생각하지 않습니다. 새로운 계획을 만들 필요 는 없다고 100 % 확신 하지만 그 이유는 정확히 다음과 같습니다. 목표를 달성 할 필요조차 없습니다. 그리고 지금 .. 당신이 페이스 북, whatsapp 또는 다른 크고 확립 된 tec 도구들과 같은 경우 – "새로운 URI-Scheme을 생성하지 마십시오"-규칙은 더 이상 당신에게 적용되지 않습니다. 귀하의 이름이 이미 전 세계적으로 회사에 연결되어있는 경우 체계 이름에 충돌이 발생하지 않습니다.
icyerasor 2016 년

6

Diego의 또 다른 대안은 라이브러리를 사용하는 것입니다.

https://github.com/airbnb/DeepLinkDispatch

처리하려는 URI 및 활동에 대한 주석을 통해 추출하려는 매개 변수를 다음과 같이 쉽게 선언 할 수 있습니다.

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

또한 쿼리 매개 변수도 활동에 전달됩니다.


1

몇 년 전에 질문이 제기 되었으므로이 URI 체계에서 Android가 많이 발전했습니다.
원래 URI 스킴에서 딥 링크 및 이제 Android 앱 링크까지.

이제 Android는 고유 한 URI 체계를 정의하지 않고 HTTP URL을 사용하는 것이 좋습니다. Android 앱 링크는 소유 한 웹 사이트 도메인으로 연결되는 HTTP URL을 사용하므로 다른 앱에서는 링크를 사용할 수 없습니다. 여기 에서 딥 링크와 안드로이드 앱 링크의 비교를 확인할 수 있습니다

이제 Android Studio 옵션 (도구> 앱 링크 도우미)을 사용하여 URI 스킴을 쉽게 추가 할 수 있습니다. 자세한 내용은 Android 문서를 참조하십시오 : https://developer.android.com/studio/write/app-link-indexing.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.