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

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

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

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



답변

카테고리의 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)이므로이를 달성하는 더 좋은 방법이있을 수 있습니다.


답변

URL에서 자동으로 매개 변수를 구문 분석하는 라이브러리가 있습니다.

같은

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

나중은 내가 쓴 것입니다. 매개 변수를 주어진 유형으로 구문 분석 할 수 있지만 항상 문자열은 아닙니다.

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 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;
    }

}


답변