2010-10-26 110 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