답변:
<intent-filter>
와 함께 <data>
요소를 사용하십시오 . 예를 들어, twitter.com에 대한 모든 링크를 처리하려면 다음과 같이 안에 넣으 <activity>
십시오 AndroidManifest.xml
.
<intent-filter>
<data android:scheme="http" android:host="twitter.com"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
그런 다음 사용자가 브라우저에서 트위터 링크를 클릭하면 작업을 완료하기 위해 사용할 애플리케이션 (브라우저 또는 애플리케이션)이 표시됩니다.
물론 웹 사이트와 앱을 긴밀하게 통합하려는 경우 고유 한 체계를 정의 할 수 있습니다.
<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
그런 다음 웹 앱에서 다음과 같은 링크를 넣을 수 있습니다.
<a href="my.special.scheme://other/parameters/here">
사용자가 클릭하면 앱이 자동으로 시작됩니다 (아마도 my.special.scheme://
uri 유형을 처리 할 수있는 유일한 앱이기 때문에 ). 이것의 유일한 단점은 사용자가 앱을 설치하지 않으면 심한 오류가 발생한다는 것입니다. 확인할 방법이 확실하지 않습니다.
편집 : 질문에 대답하기 getIntent().getData()
위해 Uri
객체 를 반환하는 것을 사용할 수 있습니다 . 그런 다음 Uri.*
메소드를 사용하여 필요한 데이터를 추출 할 수 있습니다 . 예를 들어 사용자가 다음 링크를 클릭했다고 가정 해 보겠습니다 http://twitter.com/status/1234
.
Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String host = data.getHost(); // "twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"
의 어느 곳에서나 위의 작업을 수행 할 수 Activity
있지만에서 할 수도 있습니다 onCreate()
. params.size()
에서 경로 세그먼트 수를 얻는 데 사용할 수도 있습니다 Uri
. Uri
특정 부분을 추출하는 데 사용할 수있는 다른 방법 은 javadoc 또는 Android 개발자 웹 사이트를 참조하십시오 .
android:exported="true"
자신 Activity
의 목록 에 추가해야합니다 . 이 답변을 확인하십시오 stackoverflow.com/a/13044911/1276636
CHROME
2014 년 1 월 28 일 현재 위의 모든 답변이 작동하지 않았습니다.
내 앱은 행 아웃, Gmail 등의 앱의 http://example.com/someresource/ 링크에서 제대로 시작 되었지만 크롬 브라우저에는 없습니다.
이 문제를 해결하려면 CHROME에서 올바르게 시작되도록 인 텐트 필터를 다음과 같이 설정해야합니다
<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:host="example.com"
android:pathPrefix="/someresource/"
android:scheme="http" />
<data
android:host="www.example.com"
android:pathPrefix="/someresource/"
android:scheme="http" />
</intent-filter>
pathPrefix
요소에 주목
사용자가 Google 검색 결과 또는 다른 웹 사이트의 링크를 클릭하여 크롬 브라우저에서 http://example.com/someresource/ 패턴을 요청할 때마다 앱이 활동 선택기 내에 나타납니다.
여기 내 의견을 참조하십시오 : Android 브라우저에서 링크를 만들어 내 앱을 시작합니까?
새로운 인터넷 방식을 정의하지 않는 한 사람들이 자신의 방식을 사용하지 않는 것이 좋습니다.
내 경우에는 두 가지 범주를 설정해야했고 효과가있었습니다 <intent-filter>
.
<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
예를 들어 다음과 같은 것이 있습니다.
앱을 여는 링크 : http://example.com
앱의 패키지 이름 : com.example.mypackage
그런 다음 다음을 수행해야합니다.
1) 활동에 인 텐트 필터를 추가하십시오 (원하는 활동이 될 수 있습니다. 자세한 정보는 문서를 확인하십시오 ).
<activity
android:name=".MainActivity">
<intent-filter android:label="@string/filter_title_view_app_from_web">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "http://example.com" -->
<data
android:host="example.com"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2) 링크를 테스트 하거나이 방법을 사용할 HTML 파일을 작성하십시오 .
<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a>
<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a>
3) 모바일 Chrome을 사용하여 테스트
4) 끝입니다.
딥 링크를 테스트하기 위해 시장에 앱을 게시 할 필요는 없습니다 =)
도해야 <category android:name="android.intent.category.BROWSABLE"/>
링크에서 올바르게 인식 활동을 확인하기 위해 텐트 필터에 추가됩니다.
다음 링크는 브라우저에서 직접 앱을 설치 (설치된 경우)하는 방법에 대한 정보를 제공합니다. 그렇지 않으면 플레이 스토어에서 앱을 직접 열어 사용자가 원활하게 다운로드 할 수 있습니다.
이 기능을 구현할 때 안드로이드 런처에서 아이콘이 사라지면 인 텐트 필터를 분할 해야하는 것보다 유의하십시오.
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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="your-own-uri" />
</intent-filter>
</activity>
예, Chrome은 체계를 찾는 대신 검색합니다. URI 스킴을 통해 앱을 시작하려면 Play 스토어에서이 멋진 유틸리티 앱을 사용하십시오. 그것은 내 하루를 저장 :) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender
펠릭스 의 답변 Xamarin 포트
에 다음 MainActivity
을 추가하십시오 ( docs : Android.App.IntentFilterAttribute 클래스 ).
....
[IntentFilter(new[] {
Intent.ActionView },
Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
....
Xamarin은 다음을 추가 AndroidManifest.xml
합니다.
<activity
android:label="Something"
android:screenOrientation="portrait"
android:theme="@style/MyTheme"
android:name="blah.MainActivity">
<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="my.special.scheme" />
</intent-filter>
</activity>
그리고 매개 변수를 얻으려면 ( OnAct of MainActivity에서 테스트 ) :
var data = Intent.Data;
if (data != null)
{
var scheme = data.Scheme;
var host = data.Host;
var args = data.PathSegments;
if (args.Count > 0)
{
var first = args[0];
var second = args[1];
...
}
}
내가 아는 한 위의 내용은 MainActivity뿐만 아니라 모든 활동에 추가 할 수 있습니다
노트:
OnCreate
응용 프로그램의의 이벤트가 MainLauncher Activity
다시 발사됩니다.<a href="my.special.scheme://host/arg1/arg2">
위의 마지막 코드 스 니펫 값은 다음과 같습니다.scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2
업데이트 : 안드로이드가 앱의 새 인스턴스를 생성하면 추가해야합니다 android:launchMode="singleTask"
.
딥 링크 처리에 대한 Felix의 접근 방식은 딥 링크 처리에 대한 일반적인 접근 방식입니다. 또한 딥 링크의 라우팅 및 파싱을 처리하기 위해이 라이브러리를 확인하는 것이 좋습니다.
https://github.com/airbnb/DeepLinkDispatch
주석을 사용하여 특정 딥 링크 URI에 대한 활동을 등록 할 수 있으며 경로 세그먼트 가져 오기, 일치 등의 일반적인 규칙을 수행하지 않고도 매개 변수를 추출합니다. :
@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
...
}
이봐, 나는 해결책을 얻었다. 카테고리를 "기본"으로 설정하지 않았습니다. 또한 의도 데이터에 Main 활동을 사용하고있었습니다. 이제 의도 데이터에 다른 활동을 사용하고 있습니다. 도와 주셔서 감사합니다. :)
example.php :
<?php
if(!isset($_GET['app_link'])){ ?>
<iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
<iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
<?php
}
else { ?>
<script type="text/javascript">
self.window.location = '<?php echo $_GET['app_link'];?>';
window.parent.location.href = '<?php echo $_GET['full_link'];?>';
</script>
<?php
}
2019 년 6 월 15 일 기준
내가 한 것은 URL을 열 수있는 네 가지 가능성을 모두 포함하는 것입니다.
즉, 접두사 가 있는 http
/ https
및 2가 www
있고없는 경우 2www
이 기능을 사용하면 브라우저와 다른 옵션을 선택하지 않아도 앱이 자동으로 시작됩니다.
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="example.in" />
<data android:scheme="https" android:host="www.example.in" />
<data android:scheme="http" android:host="example.in" />
<data android:scheme="http" android:host="www.example.in" />
</intent-filter>