Android 브라우저에서 링크를 통해 앱을 시작 하시겠습니까?


229

다음과 같은 링크를 만들 수 있습니까?

<a href="anton://useful_info_for_anton_app">click me!</a>

Anton 앱이 시작됩니까?

마켓 프로토콜을 사용하는 Android 마켓 앱에서 작동하지만 다른 앱으로 비슷한 작업을 수행 할 수 있다는 것을 알고 있습니다.

다음은 Android 마켓을 시작하는 링크의 예입니다.

<a href="market://search?q=pname:com.nytimes.android">click me!</a>

업데이트 : eldarera가 제공 한 답변은 훌륭하지만 <intent-filter>태그 하위 요소의 순서에 문제가 있다고 언급하고 싶습니다 . 내가 <intent-filter>가진 문제를 피하기 위해 해당 태그의 새로운 하위 요소로 다른 것을 만드는 것이 좋습니다 . 예를 들어 내 AndroidManifest.xml모습은 다음과 같습니다.

<activity android:name=".AntonWorld"
          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>
        <data android:scheme="anton" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

모바일에서 응용 프로그램을 열 수 없을 때 문제가 해결되었습니다.
Unomono

9
xml 태그의 순서를 언급하면 ​​+1입니다. 그것은 절대적으로 이해가되지 않으며 어디에도 문서화되어 있지 않지만, action 및 category 태그 아래에 데이터 태그가있을 때 작동하지 않는다는 것을 알았습니다.
Adam

다른 모든 Android 브라우저 (Chrome, Default, Webviews, Firefox 등)의 복잡성을 감안할 때 앱으로 리디렉션하고 앱이없는 경우 올바르게 다시 떨어지는 것도 악몽 일 수 있습니다. branch.io의 서비스는이 작업을 수행하는 데 도움이 무료입니다.
Alex Austin

@Anton .... hello 선생님 ... 위의 코드에 따르면 링크의 데이터 만 처리하는 것으로 이해합니다 ... 내 데이터가 포함 된 링크를 만드는 방법을 알려주십시오 ... 도움이됩니다 저 ... 버튼 클릭 이벤트에 관한 데이터로 링크를 만들고 싶습니다.
Ravindra

1
⚠️ 저는 다른 사람들도 알고 싶어하는 디버깅 장애물을 우연히 발견했습니다. 링크는 웹 페이지의 <a href=""> 링크와 adb로 시작할 때 작동하지만 이제는 모바일에 URL을 입력하면 브라우저 주소 표시 줄 ⚠️
Johannes Brodwall

답변:


96

<intent-filter>Mainfest 파일 의 요소 를보고 싶을 것 입니다. 특히, <data>하위 요소 에 대한 문서를 살펴보십시오 .

기본적으로, 당신이해야 할 일은 자신의 계획을 정의하는 것입니다. 다음과 같은 내용이 있습니다.

<intent-filter>
    <data android:scheme="anton" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
    ...
</intent-filter>

그런 다음 anton:URI 체계로 시작하는 링크를 사용하여 앱을 시작할 수 있어야합니다 .


3
이 실을 살펴보십시오. 꽤 좋은 예가 있습니다 : stackoverflow.com/questions/2958701/…
eldarerathis

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

3
이것은 이전 안드로이드 버전에서는 완벽하게 작동하지만 롤리팝에서는 작동하지 않습니다.
Salmaan

1
@eldarerathis 이것은 응용 프로그램이 닫혀 있지만 응용 프로그램이 백그라운드에서 실행 중이고 활동이 필터가 연결된 의도와 다른 경우 처리 할 수없는 경우 작동합니다. 모든 활동에서 작동하도록 이것을 어떻게 관리합니까? 인 텐트 필터를 모든 필터에 넣습니까?
Mustafa Güven

5
이 답변은 구식입니다. Chrome 40 이후에는 작동하지 않습니다. 보안 문제로 인해 Chrome에서 맞춤 구성표가 사용 중지되었습니다.
Utsav Gupta

280

그런 맞춤 구성표를 사용하지 마십시오 !!! URI 스킴은 네트워크 글로벌 네임 스페이스입니다. 전 세계적으로 "anton :"체계를 소유하고 있습니까? 아니? 그런 다음 사용하지 마십시오.

한 가지 옵션은 웹 사이트를 보유하고 해당 웹 사이트의 특정 URI에 대한 의도 필터를 갖는 것입니다. 예를 들어, 다음은 Market이 웹 사이트에서 URI를 가로 채기 위해 수행하는 작업입니다.

        <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="http" android:host="market.android.com"
                android:path="/search" />
        </intent-filter>

또는 "intent :"체계가 있습니다. 이를 통해 거의 모든 의도를 URI로 설명 할 수 있으며, 클릭하면 브라우저가 실행을 시도합니다. 이러한 체계를 구축하는 가장 좋은 방법은 시작하려는 의도를 구성하는 코드를 작성한 다음 intent.toUri (Intent.URI_INTENT_SCHEME)의 결과를 인쇄하는 것입니다.

이 의도를 가진 조치를 사용하여 해당 조치를 지원하는 활동을 찾을 수 있습니다. 브라우저는 보안상의 이유로 BROWSABLE 카테고리를 실행하기 전에 인 텐트에 자동으로 추가합니다. 또한 같은 이유로 제공 한 명시 적 구성 요소를 제거합니다.

앱만 실행하도록하려면이 범위를 사용하는 가장 좋은 방법은 자체 범위 작업을 수행하고 Intent.setPackage ()를 사용하여 Intent가 앱 패키지와 만 일치한다는 것입니다.

둘 사이의 절충 :

  • http URI를 사용하려면 소유 한 도메인이 있어야합니다. 사용자에게는 항상 브라우저에 URI를 표시하는 옵션이 제공됩니다. 앱이 설치되지 않은 경우 단순히 웹 사이트에 도착하는 대체 속성이 있습니다.

  • 인 텐트 URI를 사용하려면 앱이 이미 Android 휴대 전화에만 설치되어 있어야합니다. 거의 모든 의도를 허용합니다 (그러나 항상 BROWSABLE 범주를 포함하고 명시 적 구성 요소를 지원하지 않음). 이를 통해 사용자가 브라우저 나 다른 앱으로 이동할 수있는 옵션이 없어도 앱만 실행하도록 지시 할 수 있습니다.


32
반면 Market 앱은 market://링크 를 처리 합니다 :)
Felix

38
market :을 사용하는 것은 실수였으며 이것은 제거되고 있습니다.
hackbod

82
사람들이 안드로이드에서 커스텀 스킴을 사용하는 이유는 대부분의 프로젝트가 iPhone 버전과
병행

12
@LambergaR에 동의하십시오. 이제 우리는 3 가지 플랫폼 (BB, iphone, Android)에서 이메일 작업에 링크를 만드는 방법을 찾아야합니다
Maragues

7
사용자 정의 구성표를 사용하여 웹 페이지에 넣은 URI는 응용 프로그램이 설치되어 있지 않은 웹 브라우저에서는 작동하지 않습니다. 그것이 당신에게 부서지지 않은 것 같습니까?
hackbod

13

나 자신을 홍보하는 것에 대해 사과하지만 웹 링크 https://github.com/eusonlito/jquery.applink 에서 기본 앱을 시작하는 jQuery 플러그인이 있습니다.

쉽게 사용할 수 있습니다.

<script>
$('a[data-applink]').applink();
</script>

<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>

12

나는 또한이 문제에 직면하여 많은 터무니없는 페이지를 봅니다. 앱을 탐색 가능하게 만들고 XML 요소의 순서를 변경하는 방법을 배웠습니다.

<activity
    android:name="com.example.MianActivityName"
    android:label="@string/title_activity_launcher">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>                
        <data android:scheme="http" />     
        <!-- or you can use deep linking like  -->               

        <data android:scheme="http" android:host="xyz.abc.com"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>

    </intent-filter>
</activity>

이것은 나를 위해 일했고 당신을 도울 수 있습니다.


안드로이드 브라우저에서 URL을 작성할 때 동일한 순서로 XML 태그를 작성하지만 선택기 대화 상자를 열 수 없습니다.
수닛 쿠마르 굽타

나는 큰 차이를 보지 못했고, 이것을 사용하면 완벽하게 작동합니다 .. 감사합니다 :)
Muthu S

6

여기 내 레시피가 있습니다 :

요청한 앱 URL로 리디렉션되는 정적 HTML을 작성하고 해당 페이지를 웹에 배치하십시오.

그렇게하면 공유 링크는 Android에 관한 한 '실제'링크입니다 ( '클릭 가능').

귀하는 일반 HTTP 링크를 '공유'합니다. www.your.server.com/foo/bar.html이 URL은 앱의 URI (window.location = "blah : // kuku")로 리디렉션되는 간단한 8 줄 HTML을 반환합니다 ( 'blah'는 더 이상 HTTP 또는 HTTPS 일 필요는 없습니다.

일단 설치하고 실행하면 위에서 제안한 모든 멋진 기능으로 HTML을 보강 할 수 있습니다.

내장 브라우저, Opera 및 Firefox에서 작동합니다 (다른 브라우저는 테스트하지 않았습니다). Firefox에서 '이 링크는 응용 프로그램으로 열어야합니다'라고 묻습니다 (확인, 취소). 다른 브라우저는 분명히 보안에 대해 크게 걱정하지 않으며 질문을하지 않고 앱을 열기 만합니다.


큰! 그것은 나를 위해 일했다. 그래서 우리는 내 앱으로 리디렉션되는 사용자 정의 체계에 대한 링크가있는 html 페이지를 추가했습니다. 내 링크는<a href="iamnearby://register_activate">Activate</a>
S. Koshelnyk

4

앱에 대한 의도 및 사용자 정의 URL 체계가 설정되면 수신 페이지 상단 의이 자바 스크립트 코드가 iOS와 Android에서 모두 작동했습니다.

<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
    navigator.userAgent.match(/android/i)) {
  var store_loc = "itms://itunes.com/apps/raditaz";
  var href = "/iphone/";
  var is_android = false;
  if (navigator.userAgent.match(/android/i)) {
    store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
    href = "/android/";
    is_android = true;
  }
  if (location.hash) {
    var app_loc = "raditaz://" + location.hash.substring(2);
    if (is_android) {
      var w = null;
      try {
        w = window.open(app_loc, '_blank');
      } catch (e) {
        // no exception
      }
      if (w) { window.close(); }
      else { window.location = store_loc; }
    } else {
      var loadDateTime = new Date();
      window.setTimeout(function() {
        var timeOutDateTime = new Date();
        if (timeOutDateTime - loadDateTime < 5000) {
          window.location = store_loc;
        } else { window.close(); }
      },
      25);
      window.location = app_loc;
    }
  } else {
    location.href = href;
  }
}
</script>

이것은 Android 브라우저에서만 테스트되었습니다. Firefox 또는 Opera에 대해 잘 모르겠습니다. 열쇠는 안드로이드 브라우저가 당신에게 좋은 예외를 던지지 않더라도 window.open(custom_url, '_blank')실패하고 null나중에 테스트 할 수있는 것입니다.

업데이트 : store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";Android에서 Google Play에 연결하는 데 사용 합니다.


1
loadDateTime / timeOutDateTime의 요점은 무엇입니까? 팝업 차단기 나 다른 문제가 발생합니까?
매트 울프

이것은 내 테스트에서 작동하지 않는 것 같습니다. 체계가 처리되지 않아도 window.open (...)은 항상 새 창을 엽니 다.
jtomson

@MattWolfe 늦게 답변해서 죄송합니다. iPhone (Safari)에서는 예외가 발생하지 않습니다. 시간 초과는 Safari가 페이지가 앱으로 리디렉션 된 후 남은 오래된 창을 닫는 데 있습니다. Safari를 거치지 않고 URL을 열 수있는 방법을 찾지 못했습니다. 이와 같은 URL을 인식하는 대부분의 다른 응용 프로그램은 동일한 작업을 수행합니다. 그것은 페이스 북에서 "딥 링크"의 장점 중 하나였다. 당신은 오래된 남은 창이 모바일 사파리를 거치지 못하게한다.
피트

@jtomson : 흥미 롭습니다. 에뮬레이터 및 Android 2.1에서 3까지의 다양한 장치에서 테스트했습니다 (당시). 어떤 기기 및 Android 버전을 테스트하고 있습니까?
Pete

4

앱에 대한 딥 링크를 처리 할 라이브러리를 고려할 수 있습니다.

https://github.com/airbnb/DeepLinkDispatch

위에서 제안한 사람들처럼 주석이 달린 활동에 의도 필터를 추가 할 수 있습니다. 모든 딥 링크에 대한 매개 변수의 라우팅 및 파싱을 처리합니다. 예를 들어 MainActivity에는 다음과 같은 내용이있을 수 있습니다.

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

쿼리 매개 변수도 처리 할 수 ​​있습니다.


1

내 간단한 트릭을 시도하십시오.

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("classRegister:")) {                  
                Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
            }               
            view.loadUrl(url);
            return true;
        }

내 HTML 링크 :

<a href="classRegister:true">Go to register.java</a>

또는 당신은 할 수 있습니다 <A HREF = "classRegister : 진정한 "> <- 클래스 파일 이름에 대해 "true"로 값

그러나이 스크립트는 mailto 링크에서 작동합니다 :)

        if (url.startsWith("mailto:")) {
            String[] blah_email = url.split(":");
            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
            Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
            startActivity(emailIntent);
        }

이것은 본질적으로 JavascriptInterface해결 방법을 호출하는 것 입니다. JavascriptInterface가 버그가있는 곳에서 2.3을 지원 해야하는 경우 올바른 해결 방법입니다.
EpicPandaForce

1

이 메서드는 앱 또는 브라우저를 열도록 요청하는 명확성 대화 상자를 호출하지 않습니다.

매니페스트에 다음을 등록하면

<manifest package="com.myApp" .. >
  <application ...>
    <activity ...>
      <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="gallery"
          android:scheme="myApp" />
      </intent-filter>
    </activity>
    ..

예를 들어 휴대 전화의 이메일에서이 URL을 클릭하면

<a href="intent://gallery?directLink=true#Intent;scheme=myApp;package=com.myApp;end"> 
  Click me 
</a>

그러면 android는 갤러리 의도에 응답 하고 myApp 구성표 가있는 com.myApp 패키지로 앱을 찾으려고 시도합니다 . 그것이 가능하지 않은 경우, 상점으로 이동하여 com.myApp을 찾고 앱이어야합니다.


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