안드로이드 브라우저에서 사용자 정의 안드로이드 응용 프로그램을 실행


답변:


616

<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 개발자 웹 사이트를 참조하십시오 .


6
신속한 답변을 보내 주셔서 감사합니다. 그러나 "my.special.scheme : //"다음에 매개 변수에 액세스하는 방법을 알려주십시오.
Parimal Modi

4
Uri에서 데이터를 추출하는 방법에 대한 지침을 포함하도록 답변을 편집했습니다. 옆에있는 확인 표시를 클릭하여이 답변을 수락 한 경우에만 해당 답변을 수락 된 것으로 표시하십시오.
Felix

9
대상 안드로이드 응용 프로그램이 설치되어 있지 않으면 어떻게합니까? 이것을 다루는 방법.
니모

13
나와 같은 방법으로이 계획을 제대로 수행 할 수없는 사람은 android:exported="true"자신 Activity의 목록 에 추가해야합니다 . 이 답변을 확인하십시오 stackoverflow.com/a/13044911/1276636
Sufian

4
이것이 전 세계에서 어떻게 작동하는지 확실하지 않습니다. 크롬에서는 작동하지 않으며 "android : pathPrefix"요소를 배치 할 때까지 브라우저에서 항상 링크를 엽니 다. 어쨌든 대답에는 설명서에 언급 된 범주 값이 없습니다. 여전히 누군가에게 효과가 없다면 다음을 참조하십시오. stackoverflow.com/a/21727055/2695276 추신 :이 일 동안 어려움을 겪었습니다.
Rajat Sharma

70

CHROME2014 년 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/ 패턴을 요청할 때마다 앱이 활동 선택기 내에 나타납니다.


이것은 나에게 많은 도움이되었습니다. 고마워요! 현상금을 수여 할 수 있도록 여기에 답변을 게시하십시오! stackoverflow.com/questions/21663001/…
Vlad Schnakovszki

이것이 무슨 언어 지?
Dims

안녕하세요, 너무 오래되었습니다. 나는 또한 같은 시나리오에 맞았다. pathPrefix, scheme 및 host를 지정했지만 작동하지 않습니다. 나는 체계로만 시도한 다음 효과가있었습니다. 그러나 호스트를 추가하면 작동이 중지되었습니다. 어떤 문제가 될 수 있는지 아십니까?
seema

내가이 대답에 올 때까지 며칠을 보냈다. pathPrefix 요소없이 전 세계에서 어떻게 작동했는지 확실하지 않습니다. 문서에 따라 모든 작업을 수행했지만 크롬에서 나를 위해 일한 적이 없습니다. 정말 고맙습니다.
Rajat Sharma

66

여기 내 의견을 참조하십시오 : Android 브라우저에서 링크를 만들어 내 앱을 시작합니까?

새로운 인터넷 방식을 정의하지 않는 한 사람들이 자신의 방식을 사용하지 않는 것이 좋습니다.


10
Hackbod는 Android 플랫폼 뒤의 Google 엔지니어 중 하나입니다. 이 조언을 따르는 것이 좋습니다. 실제로 허니컴에서 이와 같은 사용자 지정 체계 지원이 중단 된 것 같습니다.
nmr

23
iOS에서 개발자에게 부과 한 제한에 대해 책임을지지 않습니다. ;)
hackbod

12
책임이 있습니까? 아니. 그러나 당신이 그것을 좋아하든 그렇지
않든

6
hackbod는 Android에 대한 질문에 특별히 답변하고 있습니다. iOS에 대한 언급은 없으므로 고려할 필요가 없습니다.
nilskp

4
@hackbod는 다른 웹 사이트에서 이와 같은 링크를 찾을 수 있다고 가정하면 구성표 이름을 지정하는 것이 좋습니다 (예 : href = "com.ourdomain.myapp // whatever")?
Julien Bérubé

48

내 경우에는 두 가지 범주를 설정해야했고 효과가있었습니다 <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>

2
여기에 추가 카테고리를 추가해야했습니다.
KPK

누군가이 작업을 수행하는 실제 프로세스가 무엇인지 설명 할 수 있습니까? 정확한 구현, 전제 조건에 대한 링크가 도움이 될 것입니다. 감사합니다
앵킷 가그

개발자 설정에서 테스트되었습니다. 실제로 도메인 이름을 잘못 지정했습니다. 내 잘못이야.
Ankit Garg

최고 등급의 답변이 저에게 효과가 없었지만 이것은 효과가있었습니다. 감사합니다.
EL45

25

예를 들어 다음과 같은 것이 있습니다.

앱을 여는 링크 : 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) 끝입니다.

딥 링크를 테스트하기 위해 시장에 앱을 게시 할 필요는 없습니다 =)

또한 자세한 내용은 설명서 및 유용한 프레젠테이션을 확인하십시오 .


작동하려면 html 파일을 만들고 업로드해야했습니다. espacially 두 번째로 왜 브라우저 (크롬)에서 직접 작동하지 않는지 궁금합니다.
Makalele

18

도해야 <category android:name="android.intent.category.BROWSABLE"/>링크에서 올바르게 인식 활동을 확인하기 위해 텐트 필터에 추가됩니다.


4
참고로 CATEGORY_BROWSABLE을 추가하면 "브라우저가 대상 활동을 안전하게 호출하여 링크 (예 : 이미지 또는 이메일 메시지)로 참조되는 데이터를 표시 할 수 있습니다."
greg7gkb

기존 카테고리입니까, 아니면 새 카테고리를 제안 하시겠습니까?
Anish

존재합니다. 분명히 다른 인 텐트 필터 태그에 별도의 웹 사이트 호스트가 있거나 문제가 발생합니다.
NoBugs

2
다만 BROWSABLE뿐만 아니라 android.intent.category.DEFAULT - 다른 응용 프로그램에서 이메일과 같은 (단지 브라우저를) 시작하면 링크가 열릴 수 있도록
AlikElzin-kilaka


7

이 기능을 구현할 때 안드로이드 런처에서 아이콘이 사라지면 인 텐트 필터를 분할 해야하는 것보다 유의하십시오.

    <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>


5

펠릭스 의 답변 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뿐만 아니라 모든 활동에 추가 할 수 있습니다

노트:

  1. 링크를 사용자가 클릭은 안드로이드 OS 앱 다시 시작하는 경우 (죽 이전 인스턴스 (있는 경우)를, 새로운 하나를 실행) 의 의미 OnCreate응용 프로그램의의 이벤트가 MainLauncher Activity다시 발사됩니다.
  2. 이 링크를 사용하면 <a href="my.special.scheme://host/arg1/arg2">위의 마지막 코드 스 니펫 값은 다음과 같습니다.
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

업데이트 : 안드로이드가 앱의 새 인스턴스를 생성하면 추가해야합니다 android:launchMode="singleTask".


3

딥 링크 처리에 대한 Felix의 접근 방식은 딥 링크 처리에 대한 일반적인 접근 방식입니다. 또한 딥 링크의 라우팅 및 파싱을 처리하기 위해이 라이브러리를 확인하는 것이 좋습니다.

https://github.com/airbnb/DeepLinkDispatch

주석을 사용하여 특정 딥 링크 URI에 대한 활동을 등록 할 수 있으며 경로 세그먼트 가져 오기, 일치 등의 일반적인 규칙을 수행하지 않고도 매개 변수를 추출합니다. :

@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
   ...
}

0

이봐, 나는 해결책을 얻었다. 카테고리를 "기본"으로 설정하지 않았습니다. 또한 의도 데이터에 Main 활동을 사용하고있었습니다. 이제 의도 데이터에 다른 활동을 사용하고 있습니다. 도와 주셔서 감사합니다. :)


사운드 가능성에서 (나는이 오래된 질문이다 어쩌면 상황이 변경되었습니다. 인식하지만) developer.android.com/guide/components/intents-filters.html#ifs 의도가 카테고리 테스트를 통과하려면, "모든 카테고리 Intent 오브젝트필터 의 카테고리와 일치해야합니다 . 필터는 추가 카테고리를 나열 할 수 있지만 의도에있는 것은 생략 할 수 없습니다. "
Noach Magedman

0

CALLBACK_URL에 의사 호스트 이름을 추가해야합니다. 'app : //'은 (는) URL로 의미가 없으며 구문 분석 할 수 없습니다.


0

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 
}

1
이렇게하면 딥 링크와 일반 링크라는 두 가지 보이지 않는 iframe이 만들어집니다. 앱이 설치되면 딥 링크 iframe에서 앱을 시작합니다. 그렇지 않으면 일반 링크가 표시됩니다. 약간의 추가 작업으로 앱 설치 후 딥 링크가 호출되는 위치에서 지연된 딥 링크가 구현 될 수 있습니다.
Dominic Cerisano

0

@JRuns 답변을 여기 에서 찾으 십시오 . 아이디어는 사용자 정의 구성표로 HTML을 작성하고 어딘가에 업로드하는 것입니다. 그런 다음 html 파일에서 사용자 정의 링크를 클릭하면 앱으로 리디렉션됩니다. 나는 기사를 안드로이드에 사용했다. 그러나 이름 Name = "MyApp.Mobile.Droid.MainActivity"활동을 대상 활동 에 설정하는 것을 잊지 마십시오.


0

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