1. 程式人生 > >點選APP外部連結喚醒APP的研究

點選APP外部連結喚醒APP的研究

有個需求,是點選簡訊中的(或者是其他地方的)URL,能夠喚起APP。

思路,首先找個實現了的APP做測試。

選擇手機淘寶做研究。

在淘寶中把寶貝連結分享到微信,結果如下:


直接點開,跳轉到微信的內建瀏覽器,指示使用者通過瀏覽器開啟:


點選在瀏覽器中開啟,效果為彈窗顯示所有的瀏覽器APP,提示選擇一個瀏覽器。此時使用淘寶開啟即跳轉到APP

把連結內容作為簡訊傳送給自己,點選簡訊中的連結,效果:

1.首先彈出安卓系統預設瀏覽器,展現出寶貝頁面

2.馬上跳轉到淘寶APP內,並展示寶貝

差異:

1.微信使用內建瀏覽器開啟;簡訊一般使用系統瀏覽器開啟。

分析:微信的實現是使用自定義的WebView;系統的實現是指定意圖,並顯示開啟指定的瀏覽器。

2.微信頁面開啟之後,需要選擇開啟的應用;簡訊開啟的頁面可以直接跳轉。

分析:簡訊可以跳轉,不是通過自定義WebView,無法使用JS介面,而且是能通過第三方APP跳轉,一定是通過安卓系統元件實現的跳轉,不是直接跳轉,說明只能攔截系統預設瀏覽器中的URL跳轉操作才能實現跳APP;

微信無法跳轉,猜測可能是對scheme特殊的URL進行了攔截。

查找了資料,可以通過修改manifest來實現一個Activity接收傳遞來的URL:

        <activity
            android:name=".activity.UrlJumpActivity">
            <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"/>
            </intent-filter>
        </activity>


然後自己寫Demo程式。

猜想如果點選web連結能夠跳轉到指定APP,則也能夠實現像淘寶那樣進入系統瀏覽器稍後跳轉到APP。

使用WebView載入自定義的HTML檔案:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script type="text/javascript">
            function showAndroidToast(toast) {
                javascript:android.showToast(toast);
            }
        </script>
    </head>
    <body>
        <input type="button" value="Say hello"
            onClick="showAndroidToast('Hello Android!')" />
        <a href="http://www.baidu.com">open http link</a>
    </body>
</html>
將HTML檔案放到APP的asset目錄下面,在啟動後加載HTML:
    // 1.載入HTML文字
    //String htmlText = AssetUtil.getFromAssets(this, "a.html");
    //mWebView.loadData(htmlText, "text/html", "utf-8");

    // 2.載入asset中的HTML檔案
    //mWebView.loadUrl("file:///android_asset/a.html");

    // 3.載入外部HTML檔案
    mWebView.loadUrl("file:///sdcard/a.html");
幾種方法都能夠成功載入HTML檔案並顯示:


請忽略那個say hello按鈕,點選open http link報錯:

ERROR_UNKNOWN_URL_SCHEME

哪裡有問題?對比淘寶,是用的系統瀏覽器,而我用的WebView,可能系統瀏覽器會額外做一些工作吧,於是使用系統瀏覽器載入這段HTML。

做了各種嘗試:

    Intent intent=new Intent();
    intent.setAction("android.intent.action.VIEW");
    //Uri uri = Uri.parse("content://com.android.htmlfileprovider/sdcard/a.html");
    //Uri uri = Uri.parse("file:///android_asset/a.html");
    Uri uri = Uri.parse("file:///sdcard/a.html");
    //Uri uri = Uri.parse("http://www.qq.com");
    intent.setData(uri);
    intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");

其中,第三種方法是可行的:把HTML檔案拷貝到外部儲存,並使用外部儲存檔案的URL傳遞給瀏覽器。

第一種方式原因未知。

第二種使用asset,查詢資料得知:要調起的APP是系統瀏覽器,而載入的檔案卻在我們自己的內部儲存中,系統瀏覽器是無法讀取檔案的,囧。

第四種直接加URL顯然可以,然並卵。

最後一行程式碼有可能無效,如果無效報manifest中未定義BrowserActivity的話則替換為下面程式碼:

intent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));

使用系統瀏覽器開啟外部儲存的HTML檔案後,效果與自定義WebView的顯示效果相同,並且點選連結後,能夠跳轉到我們想要的Activity。

當然,如果我們的H5介面上線了,就不用載入我們自己的HTML檔案了。

總結:

點選外部URL跳轉到自己的APP介面是可行的。

需要在manifest檔案中對目標Activity新增攔截指定的scheme的配置。

web端要做的:與APP定跳轉Activity的私有協議,在頁面中直接觸發此條私有協議,來達到淘寶的效果。

APP端需要做的工作還有:接收web端傳來的引數進行處理。

系統預設瀏覽器無法載入APP內部HTML檔案。

自定義WebView和系統瀏覽器還是有區別的,系統瀏覽器會根據scheme觸發可以響應的安卓元件。

相關推薦

APP外部連結喚醒APP研究

有個需求,是點選簡訊中的(或者是其他地方的)URL,能夠喚起APP。 思路,首先找個實現了的APP做測試。 選擇手機淘寶做研究。 在淘寶中把寶貝連結分享到微信,結果如下: 直接點開,跳轉到微信的內建瀏覽器,指示使用者通過瀏覽器開啟: 點選在瀏覽器中開啟,效果為彈窗顯示所

[Android] 外部連結喚醒App

移動網際網路發展到今天,一個移動app需要和各種各樣的外部連結關聯,它不再僅僅從手機的桌面啟動,更多的將會從其他的應用、瀏覽器連結、簡訊、二維碼或者微信分享等渠道啟動,這裡涉及到的是各種各樣的營銷渠道和方式。 那麼從我們的技術角度來說,我們今天要說明一下的是,從外部連結

只需一下即可為網站/APP註冊建立虛假線上身份

你可能經常在各種網站或者APP上註冊賬號,它們大多數都會要求填寫一些私人資訊。這樣,他們就擁有了你的姓名、電子郵件、電話、使用者名稱密碼組合等。 當然,他們可能會向您保證資訊是私密且安全的,但是,你是否經常看到網上報道的XXX網站被攻擊,多少多少資料洩露呢?  

網站按鈕開啟微信APP

點選a連結直接跳轉到微信APP <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="w

Android 仿QQ退出(返回鍵不退出app,icon直接進入上次退出的頁面)

 在登入頁或者歡迎頁onCreate方法加入如下程式碼:   if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_

android網頁調起app並且傳參, 網頁高速下載跳轉app

我們有時候需要用到在自己的網站上點選高速下載,然後把引數傳到自己的app裡面進行下載。或者在別人的網站點選下載的時候調起我們的app作為下載器進行下載。那麼具體怎麼實現呢?我們分兩種情況: 一、自己的

Android 6.0 跳轉到其他APP,然後立即返回的Bug處理

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ComponentName cn = am.getRunningTasks(1).get(0

為org.eclipse.swt.widgets.Text 新增可的超連結

可以為text, 也可以為label 新增可以點選的超連結。 程式碼如下: package us63740.parts; import java.awt.Desktop; import java.io.IOException; import java.net.URI; import jav

Linux操作入門練習之shell指令碼附答案(文末連結

資料共享與整合技術 練習5 1、編寫shell指令碼,計算1-100的和; 指令碼: 結果驗證: 2、將一目錄下所有檔案的副檔名改為bak 指令碼: 驗證; 3、寫一個指令碼,統計/etc目錄下共有多少個目錄檔案 驗證: 4、寫一個指令碼, 依次向/etc/p

webbrowser網頁內部連結阻止從IE開啟

使用mfc webbrowser控制元件載入的網頁,如果點選網頁內部連結時,總是自動使用IE瀏覽器開啟新連結網頁,那麼,該如何阻止IE開啟新連結,而是用webbrowser控制元件開啟網頁連結了。 在這裡有一種很簡單的方法,為webbrowser控制元件新增NewWindow3訊息響應 在

UILabel實現超連結

為了例項化咱們的Label時必須做點啥.. 先來個協議. .h檔案複製程式碼 #import <Foundation/Foundation.h> @class MyLabel; @

WordPress後臺連結出現404錯誤,所有URL少/wp-admin/ 目錄

剛才幫一個朋友跟我講wordpress後臺不管點什麼都會出現404,解決辦法也很簡單。 預設的nginx的wordpress偽靜態是 location / { if (-f $request_filename/index.html){ r

jsp 模擬按鈕,button,連結到a標籤,是a標籤的地址跳轉

<button id="btn"></button><a href="www.baidu.com" id="link">link</a><script>document.getElementById("btn").

微信圖文訊息連結 先跳空白頁 再跳目標頁android

今天做微信開發遇到了個問題噁心了一下午終於解決了。 問題是這樣的:有一個多圖文訊息,然後每個圖文訊息都是一個連結, 例如A連結,當點選A連結時在Android系統會先跳一個空白頁之後再跳轉到目的頁B,在IOS不會有這個問題, 最終發現原因是這樣的: 比如B頁的連結是"htt

popupwindow外部區域,事件的響應問題

點選外部消失,點選外部其他控制元件不觸發其他事件 // 設定此引數獲得焦點,否則無法點選 pop.setFocusable(true); 2.點選按鈕彈出彈框,點選外部

android 分享的連結跳轉到應用程式

我們時常會遇到這種需求,點選一個連結跳轉到我們的應用程式當中。 (點選一個連結跳轉到一個下載apk的html,這是沒有安裝這個apk的情況,如果安裝了可以直接跳轉到我們的apk應用當中) 如果需要帶入資料過去只需在連結的網址上加入引數即可例如: <a href="ht

js將文字中的url替換成可的超連結

window.onload=function(){ var div = document.getElementById("content"); var s=div.innerHTML; var re = /(http:\/\/[\w.\/]+)(?!

同一jsp頁面實現左邊不同連結右邊顯示詳情資訊,解決區域性重新整理

一、此需求可解決區域性重新整理,例如左邊連結直接去後臺返回新的jsp頁面,同時把頁面需要的資料返回。頁面中直接獲取就ok <html> <head> <me

EditText外部輸入法關閉的方法

對經常用到的方法做一個記錄 Android開發常用到點EditText外部需要隱藏輸入法下面是解決辦法: 將程式碼複製到基類Activity中並引入相應的包即可一勞永逸 @Override public boolean dispatchT

使用YYText-文字藍色文字實現超連結跳轉

NSString *text = @"唐寅,生於成化六年二月初四,卒於嘉靖二年十二月二日,字伯虎,後改字子畏,號六如居士、桃花庵主、魯國唐生、逃禪仙吏等,明代畫家、書法家、詩人。"; NSMutableAttributedString *one = [[NSMutableA