내 Android 앱을 열기 위해 브라우저에서 링크를 가로 채기


107

사용자가 특정 패턴의 URL을 클릭하면 브라우저가 열도록 허용하는 대신 내 앱에서 링크를 열도록 요청하고 싶습니다. 사용자가 브라우저 또는 이메일 클라이언트의 웹 페이지에 있거나 새로 생성 된 앱의 WebView에있는 경우 일 수 있습니다.

예를 들어 휴대폰 어디에서나 YouTube 링크를 클릭하면 YouTube 앱을 열 수 있습니다.

내 앱에서이 작업을 어떻게 수행합니까?


답변:


141

카테고리의 android.intent.action.VIEW 사용 android.intent.category.BROWSABLE을 .

Romain Guy의 Photostream 앱의 AndroidManifest.xml 에서

    <activity
        android:name=".PhotostreamActivity"
        android:label="@string/application_name">

        <!-- ... -->            

        <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="flickr.com"
                  android:pathPrefix="/photos/" />
            <data android:scheme="http"
                  android:host="www.flickr.com"
                  android:pathPrefix="/photos/" />
        </intent-filter>
    </activity>

활동 에 들어가면 작업을 찾은 다음 전달받은 URL로 작업을 수행해야합니다. 이 Intent.getData()방법은 Uri를 제공합니다.

    final Intent intent = getIntent();
    final String action = intent.getAction();

    if (Intent.ACTION_VIEW.equals(action)) {
        final List<String> segments = intent.getData().getPathSegments();
        if (segments.size() > 1) {
            mUsername = segments.get(1);
        }
    }

그러나이 앱이 약간 오래된 버전 (1.2)이므로이를 달성하는 더 좋은 방법이있을 수 있습니다.


8
한 가지 알아 두어야 할 사항은 앱을 핸들러로 등록하는 것이므로 사용자에게 적합한 앱을 사용할 수있는 선택권이 제공됩니다. 개인적으로 (사용자로서) "기본 작업"을 선택할 수 있다는 것을 알고 있지만 짜증이납니다
Bostone 2010 년

1
HTC 폰에서는 작동하지 않습니다. HTC 휴대폰에서 작동하도록하려면 어떻게해야합니까?
user484691

57
쿼리 문자열을 포함하는 전체 URL에 관심이 있다면 getData () 대신 intent.getDataString ()을 사용하고 싶을 것입니다. 이 의견은 그냥 날 비용 당신에게 시간을 절약 할 수 ..... :-(
켄튼 가격

사용자가 모든 앱에서 탐색하는 모든 URL에 대해 호출됩니까, 아니면 기본 브라우저에서만 호출됩니까?
gonzobrains 2013

1
어떤 앱에서 (즉, 사용하는 Intent.ACTION_VIEW 의도)
jamesh


0
private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        setUrlparams(url);

        if (url.indexOf("pattern") != -1) {
            // do something
            return false;
        } else {
            view.loadUrl(url);
        }

        return true;
    }

}

4
감사. 이것은 웹뷰를 소유하고있는 상황에서 유용합니다. 내가 묻는 질문은 내 앱이 모든 앱 (예 : 브라우저)의 링크 클릭을 가로채는 방법이었습니다.
jamesh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.