2010-10-26 403 views
40

我試圖創建自己的url方案,所以我的android應用程序可以通過URL調用,但現在我沒有成功。android自定義url方案..?

我試着去使用這個URL工作:cedemo://com.cedemo.scan X = TOTO

這裏是我的清單文件的一部分:?

<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.GALLERY" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="cedemo" android:host="com.cedemo.scan" /> 

     </intent-filter> 
</activity> 

有誰可以幫告訴我有什麼不對? 此外,如果有人發現什麼是錯的,有人可以告訴我如何從我的應用程序的Android代碼內讀取「X」變量?


更新:

更新:我做動作的修改(如答案的一個決定),它的正常工作。問題是我仍然無法獲得url變量值。這是我試過的代碼。

final Intent intent = getIntent(); 
final String myScheme=intent.getScheme(); 
final Bundle myBundle=intent.getExtras(); 
final boolean inContestKey; 
if (myBundle != null) { 
    inContestKey=myBundle.containsKey("inContest"); 
} 
final Uri myURI=intent.getData(); 
final String value; 
if (myURI != null) { 
    value = myURI.getQueryParameter("inContest"); 
} 

但我收到null從所有的功能...我還能做什麼?

也許我應該更好地解釋我的軟件的情況下:

  1. 我的軟件啓動
  2. 我的軟件推出,然後在瀏覽器
  3. 用戶點擊瀏覽器中的鏈接和瀏覽器去對於URL方案,回用變量「X」的軟件(例如)
  4. 軟件應讀取變量「X」

但在我的情況下:mySchememyBundlemyURI設置爲null

任何想法?


更新:

我找到了答案是,你必須要在主要活動做到這一點。

回答

42

我認爲問題出在你定義的Action上。 有一個「android.intent.action.VIEW」,這是我想你想要的。

<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait"> 
     <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="cedemo" android:host="com.cedemo.scan" /> 

     </intent-filter> 
</activity> 

試試看,我敢打賭會正確解析。我只做了這個假設,因爲你包含瀏覽器通常使用的可瀏覽類別,它不知道你的任何自定義操作。如果你想要的畫廊行動,你已經暗示然後就創建2個過濾器

<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.GALLERY" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="cedemo" android:host="com.cedemo.scan" /> 

     </intent-filter> 
     <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="cedemo" android:host="com.cedemo.scan" /> 

     </intent-filter> 
</activity> 

你的活動,你可以不喜歡的內容中,以便:

// Value should be "toto" as in your example 
String value = getData().getQueryParameter("X"); 
+0

您好:感謝您的相關信息這麼多。我將ACTION更改爲action.VIEW,並且工作正常。唯一的是,我無法趕上url變量「X」...我試過這段代碼: – Fabien 2010-10-27 07:59:05

+0

public void onStart(){ \t super.onStart(); \t \t \t final Intent intent = getIntent(); \t final String myScheme = intent.getScheme(); \t final Bundle myBundle = intent.getExtras(); \t final boolean inContestKey; (myBundle!= null) \t \t inContestKey = myBundle.containsKey(「inContest」); final Uri myURI = intent.getData(); final String值; if(myURI!= null) \t value = myURI.getQueryParameter(「X」); 但一切都收到NULL值...我能做什麼? – Fabien 2010-10-27 08:00:11

+0

爲了更好的閱讀,我編輯了我的問題。 – Fabien 2010-10-27 08:05:54

7

什麼最終確定的事情對我來說是更改XML元素的訂單。具體來說,交換數據和動作行,以便數據在動作開始工作之前進行。

 <intent-filter> 
     <data android:scheme="myappname" /> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 

爲了完整起見,我在html中的鏈接是「myappname:// noop」。

+0

剛剛測試過,這個命令對我來說沒有什麼不同。 – 2016-09-17 08:54:26

3

還有一件事,我想扔光。最初它不適合我,因爲我在View/Default/Browsable/data之前使用Main/Launcher標籤。

一旦我改變了順序,它開始工作正常。 即起初不工作密碼

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

<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="myapp" /> 
</intent-filter> 

正確的密碼才能

<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="myapp" /> 
</intent-filter> 

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

和方法來測試Android是非常簡單的。 進行任何HTML文件中插入

<a href="myapp://http://www.google.com/">test to launch myapp</a> <br /><br /> 

只需打開這個網站文件,然後單擊測試.... :-)

+0

剛剛測試過,這個命令對我來說沒有什麼不同。 – 2016-09-17 08:54:10