2011-02-25 52 views
11

我有一種情況,我希望將一些數據從移動網站傳遞到原生Android應用程序。一個複雜的情況是,在正常情況下,移動網站加載時可能不會安裝原生Android應用程序。有沒有辦法將消息從Android瀏覽器傳遞給應用程序?

下面是一個例子:

我ExampleApp中的一個用戶,我想與你分享從ExampleApp中的數據,從來沒有誰安裝ExampleApp中的特定部分。

我向您發送一封電子郵件,其中包含指向移動網頁的鏈接,該鏈接用於瞭解打開鏈接時要查看哪些數據。但是,由於數據只在本機應用程序中提供,而不是在移動網絡中提供,因此您會轉到要求您前往Android電子市場並安裝ExampleApp的頁面。

您安裝了ExampleApp,理想情況下,您將直接轉到與我共享的那條數據。

最大的問題是查看移動網頁與安裝ExampleApp之間的斷開。

我已經想過了幾個解決方案,但也獲得了成功(這麼說,我可能只是被錯誤地執行這些):

  1. 坐落在我們的域中的Cookie,包括數據,當移動網頁被加載。然後,打開ExampleApp時,啓動WebView以在同一個域上請求頁面並檢查cookie的值。使用它來確定在ExampleApp中顯示哪些數據。
  2. 使用JavaScript localStorage存儲對該數據段的引用,並使用WebView在該域上獲取頁面並從ExampleApp請求localStorage的內容。

在這兩種情況下,似乎WebView和瀏覽器都是彼此遠離的沙箱,所以您無法獲取兩者之間的cookies/localStorage。

有沒有其他方法可以「留下碎屑」或設置一條消息,指稍後安裝的應用程序可以從瀏覽器訪問?

編輯:鑑於一些回覆,我應該提到,我只希望你點擊鏈接一次,不必點擊一次,安裝應用程序,然後再次點擊打開應用程序到正確的地方。

+0

我很害怕,從我的瀏覽器中得到信息的應用程序。看起來像我購買的「酷遊戲」將由市場營銷公司支付,只需耕種數據。我當然希望你不能這樣做! – corsiKa 2011-02-25 23:49:43

回答

0

使用GET參數:http://exampleapps.com?token=mK7Fyt5想一想YouTube應用程序的工作方式。你被髮送到視頻鏈接。如果您沒有YouTube應用,則會看到移動網站(您的情況可能是安裝鏈接)。如果這樣做,系統會詢問是否使用本地應用程序打開YouTube鏈接,然後本地應用程序會傳遞調用該​​URL的URL,從中解析出要顯示的視頻的參數。

使用以下意圖過濾器:

<intent-filter> 
    <data android:scheme="http" android:host="exampleapps.com"/> 
    <action android:name="android.intent.action.VIEW" /> 
</intent-filter> 
+0

對不起,我想我的問題應該已經更清楚了。這個想法是讓人們安裝應用程序,因爲這是他們可以看到內容的唯一方式。 因此它是:移動網頁=>存儲數據=>用戶安裝應用程序=>用戶打開應用程序=>應用程序檢索數據=>應用程序直接打開檢索到的內容 – iseff 2011-02-26 00:11:54

+1

啊,這有點清晰。我不認爲這是可能的,無論如何這不是預期的行爲,用戶將會回到他們在安裝應用程序後發送的鏈接的想法。 – fredley 2011-02-26 00:13:12

4

是否有任何其他的方式來「留下帶crumbtrail」或設置後安裝的應用可以從瀏覽器訪問的消息?

我認爲有一個更簡單的解決方案,即條碼掃描器所採用的解決方案。

步驟#1:創建一個漂亮的RESTful URL,其中包含所需的信息。通過RESTful我的意思是沒有?,沒有#,沒有那個廢話。如果這是一個獨特的域名,它會更簡單,但這可能只是現有域中的某些內容。爲了這個答案的目的,我會假設這個URL看起來像http://android.exampleapp.com/our/custom/data/goes/in/here/somewhere

步驟#2:對於可以按照步驟1的模式創建的所有URL(http://android.exampleapp.com中的任何內容),Web服務器應該提供一個頁面,上面寫着「嗨!您沒有安裝ExampleApp!點擊此鏈接,它會帶你到Android Market,在那裏你可以安裝ExampleApp!然後,嘗試點擊將你帶到這個頁面的鏈接,它將啓動ExampleApp並給你... ummm ...全部這個好數據「。

步驟#3:實施在ExampleApp中的活性,其具有與所述VIEW動作的<intent-filter>,所述BROWSEABLE類別和<data>元件識別您的方案和結構域(和,如果需要的話,底座的路徑,如果這將是所有這些鏈接都一樣)。

如果用戶沒有安裝ExampleApp並單擊該鏈接,則用戶看到的是第2步中的Web頁面,可以從中安裝ExampleApp。

用戶看到的內容,如果他們確實安裝了ExampleApp並單擊該鏈接,那麼您的活動就是通過getIntent().getData()獲取URL並執行一些有用的操作。


UPDATE

在評論,您寫道:

移動網頁=>存儲數據=>用戶安裝的應用程序=>用戶打開應用程序=>應用程序檢索數據=>應用程序直接打開檢索到的內容

恕我直言,你做了太多關於用戶將要做什麼的假設。我用粗體顯示的箭頭之間可能會有幾天,幾周或幾個月的延遲。

如果你打算自己發佈它(例如,離開你的Web服務器),你總是可以選擇將它們中的數據「燒」成一個自定義的APK,但是你必須處理管理更新你自己。

或者,如果您打算使用基於帳戶的系統,請讓他們在將您的網站發送到Android電子市場之前在您的網站上創建一個帳戶。將數據存儲在該帳戶下,當它們從應用程序連接回該帳戶時,您可以將數據與應用程序進行匹配。

+0

這也是基於用戶的兩次點擊來實現的。我希望能夠通過點擊他們收到的URL來減少這一點。然後,我們可以輕鬆地通過安裝過程移動它們,並且可以立即查看數據。關於這個的想法? – iseff 2011-02-26 00:22:07

+0

@iseff:「這也是基於用戶點擊兩次以實現目標。」 - 無論你如何實現它,它都會是兩次以上的點擊。你有沒有在Android上安裝過應用程序?市場中會有2-3次點擊,並使用通知來啓動應用程序,而不管市場之前或應用程序內的點擊次數如何。順便說一句,我添加了一些更多的筆記給我的答案。 – CommonsWare 2011-02-26 00:51:51

+0

當然,這將是兩次以上的完整點擊;我的意思是在* original *鏈接上點擊兩次(點擊一次,發送到「下載應用程序」頁面,安裝應用程序,再次點擊,發送到應用程序)。我正在尋找無縫流動。我們當然想到註冊過程,但再次,減少摩擦更好。就箭頭之間的「天/小時/月」延遲而言,我們可以通過與市場的鏈接進行數據存儲來最小化,然後在大多數情況下,它會非常快。顯然有很多方法可以解決這個問題,但我正在尋找最少的摩擦。 – iseff 2011-02-26 01:17:38

10

解決方案其實很簡單,我有點驚訝,沒有人能夠提出一年以上。所以這裏是:

基本的想法是使用cookie來存儲信息。數據流如下:

打開網頁 - >設置cookie - >重定向到市場 - >安裝應用程序 - >啓動瀏覽器與網頁 - >讀取cookie - >用cookie數據啓動自定義意圖 - >捕獲意圖並讀取cookie數據

用戶訪問網頁(例如通過掃描QR碼)。該網頁的網址擁有對您想要傳遞的數據的引用,或者保存數據本身。該網站將數據設置爲Cookie並重定向到Android市場(http://market.android.com/details?id=com.yourapp)。一旦你的應用程序啓動,你打開一個瀏覽器並再次加載相同的網頁。但是,這一次,它檢測到Cookie已設置並重定向到自定義URL方案,如example://example.com/installed?id = DATA,而不是市場。使用意圖過濾器,您可以啓動活動並從意圖中提取信息。

下面是相關活動代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent intent = getIntent(); 
    if(intent == null || intent.getData() == null || !"example".equals(intent.getData().getScheme())) { 
     String url = "http://example.com/yourApp/index.php"; 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     i.setData(Uri.parse(url)); 
     startActivity(i); 
     finish(); 
     return; 
    }else { 
     Uri uri = intent.getData(); 
     if("example".equals(uri.getScheme())) { 
      id = uri.getQueryParameter("id"); 
     } 
    } 
    ... initialise your activity ... 
} 

一個簡單的PHP文件(網頁),便於演示:

<?php 
$value = "123"; 
if(!isset($_COOKIE["TestCookie"])) { 
    setcookie("TestCookie", $value, time()+3600); /* expire in 1 hour */ 
    header("Location: http://market.android.com/details?id=com.yourapp"); 
    exit; 
}else { 
    header("Location: example://example.com/installed?id=".$_COOKIE["TestCookie"]); 
    exit; 
} 
?> 

而且意圖過濾器:

<!-- Handle URLs like loyalty://example.com/merchant/123 --> 
<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="example" android:host="example.com" /> 
</intent-filter> 

BTW ,我已決定對此問題blog

+0

你通過了這個測試嗎?在原始問題中,iseff引用他的Cookies爲不工作(沙箱環境),所以我想知道您是否能夠從App中的瀏覽器訪問Cookie TestCookie。謝謝 – DougA 2012-03-16 14:22:35

+1

當然,我測試過它的工作原理!請注意,設置cookie並檢索它的網站然後啓動定製意圖,始終在股票Android瀏覽器中打開,而不是在WebView中打開。因此,cookie將可用。 – Florian 2012-03-19 08:22:56

+1

太棒了!你提到「股票瀏覽器」,但非股票瀏覽器如Firefox或SkyFire呢?我希望它適用於所有瀏覽器,而不僅僅是默認。 (如果你可以成爲一個親愛的人,並且測試這些......這對我肯定會有幫助的人很有幫助!) – DougA 2012-03-19 12:13:05

0

見:用戶點擊該鏈接並安裝你的廣播接收器將接收廣播com.android.vending申請後
http://market.android.com/details?id=your.package.name&referrer=your_wanted_parameter

https://stackoverflow.com/a/7577379/710284

您可以像使用一個INSTALL_REFERRER鏈接。帶有「your_wanted_pa​​rameter」值的INSTALL_REFERRER。

更多信息:
http://code.google.com/mobile/analytics/docs/android/#android-market-tracking
Get referrer after installing app from Android Market
Get Android Google Analytics referrer tag

+0

推薦人看起來不可靠,並且在某些設備上不起作用。諸如「Google Play推薦人測試」和「安裝推薦人測試」之類的市場應用不會在我的Galaxy S III上顯示推薦人。 – 2013-07-01 14:47:57

相關問題