深层链接意图不起作用

时间:2014-07-17 16:22:06

标签: android android-intent android-manifest deep-linking

我按照https://developer.android.com/training/app-indexing/deep-linking.html上的说明进行操作,但是当我想通过adb触发意图时:

adb shell am start
           -W -a android.intent.action.BROWSEABLE
           -d "http://example.com/gizmos" com.myapp.android

我得到了

  

Error: Activity not started, unable to resolve Intent { act=android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.myapp.android }

<activity
        android:name=".activities.DeepLinkActivity"
        android:label="@string/title_activity_deep_link">
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />

        <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="example.com"
                android:pathPrefix="/gizmos" />
        </intent-filter>
    </activity>

我有任何明显的错误吗?

12 个答案:

答案 0 :(得分:101)

修改

好的,首先确保您的包可以通过adb访问:

adb shell am start -n com.example.simon.test/.activities.MainActivity

然后要接受多个数据标记,您需要使用不同的意图过滤器(它对我的工作方式不同于我在网上看到的所有其他示例)。 E.g:

<intent-filter>
    ...
    <data android:scheme="http"
          android:host="example.com"/>
</intent-filter>
<intent-filter>
    ...
    <data android:scheme="http"
          android:host="example.com"
          android:pathPrefix="/gizmos"/>
</intent-filter>

注意在上面的示例中,pathPrefix以正斜杠开头!

我不确定为什么Google的文档会如此误导或者可能是因为某些不同版本的adb,但上述更改对我来说非常有效。这有助于:Source


这就是我将Chrome浏览器路由指向我应用的特定链接的方式:

<activity
    android:name=".activities.DeepLinkActivity"
    android:label="@string/app_name">
    <!-- Accept chrome links -->
    <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="example.com"
            android:pathPrefix="/"/>
    </intent-filter>
    <!-- Accept adb data flag -->
    <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="example.com"/>
    </intent-filter>
</activity>

注意第一个过滤器适用于Google Chrome,第二个适用于ADB。

NOTE2 如果链接已输入浏览器的地址栏,则无法显示应用选择菜单。 是某个页面的<a href="http://example.com"></a>链接。

在我看来,这里的一切都相当模糊,而且我的预期并非如此。但这就是它在我的设备上的工作原理。希望这对你有帮助(并且也有效)。

答案 1 :(得分:12)

经过一些测试后,这对我有用:

    <activity android:name=".activities.MainActivity">
        <intent-filter android:label="@string/app_name">
            <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="www.example.com"
                  android:pathPrefix=""
                />
            <data android:scheme="myschema"
                  android:host="example"
                  android:pathPrefix=""
                />
        </intent-filter>
    </activity>

点击浏览器中的任何链接,例如&#34; http://www.example.com&#34;,&#34; http://www.example.com/&#34;或&#34; http://www.example.com/whatever&#34;。与&#34; myschema:// example / whatever&#34;相同。

还可以使用此命令(使用任何这些URL)与adb一起使用:

adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com" com.example

希望帮助你入门。

当一切正常时,您可能希望为不同的活动配置不同的pathPrefix

答案 2 :(得分:4)

就我而言,我使用的是仿真器,而不是实际的USB连接设备,因此,我必须将-d更改为-e,如下所示:

adb shell am start -W -a android.intent.action.VIEW -e "http://www.example.com" com.example

在深层链接之前注意 -e

答案 3 :(得分:2)

首先,在此页面上阅读@ user3249477的答案。

我只想添加而不是他写的内容,你可以使用pathPattern来压缩它:

<activity
    android:name=".activities.DeepLinkActivity"
    android:label="@string/app_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="example.com"
            android:pathPattern=".*"/>
    </intent-filter>
</activity>

&#34;。*&#34;匹配空字符串和&#34; /&#34;,因此两种情况都被覆盖。如果您最终尝试处理多个方案和主机,这一点变得尤为重要,因此您不必向{http,https} X {&#34;&#发送电子邮件34;,&#34; /&#34;} X {&#34; foo&#34;,&#34; bar&#34;等等}

答案 4 :(得分:2)

就我而言,我在MainActivity中加入了深层链接意图过滤器,MainActivity也是主要的启动器。这导致了这个问题。

在我创建另一个单独的活动并将intent过滤器放在那里之后,它解决了这个问题。希望这可以帮助那些面临同样问题的人。

答案 5 :(得分:1)

确保您的网址采用此格式(上限字母替换为您自己的):

  

android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams

adb工具不需要此格式。有了上述内容,您现在可以将它放在src或href中,如下所示:

[NSNull null]

答案 6 :(得分:1)

使用adb shell am start            -W -a android.intent.action.VIEW            -d“http://example.com/gizmos”com.myapp.android

它会起作用。

答案 7 :(得分:1)

在我的情况下,我在网址中有一个端口8075,我将其删除并且有效

答案 8 :(得分:1)

./ adb shell am start -n packagename / .splash.SplashActivity -d&#34; schemeName:// content&#34;

答案 9 :(得分:0)

感谢Simas的回复,我想补充一些说明:

    使用此命令测试您的活动后
  • adb shell am start -n com.example.simon.test / .activities.MainActivity

  • 在将意图过滤器添加到AndroidManifest.xml文件后,您将需要测试深层链接(如下所示):

        ...          ...     

所以这是你可以测试的adb命令:

adb shell am start -W -a android.intent.action.VIEW -d "http://example.com/gizmos" com.example.packageid

adb shell am start -W -a android.intent.action.VIEW -d "http://example.com" com.example.pakageid

答案 10 :(得分:0)

如果您没有权限问题,则可能与API级别相关

答案 11 :(得分:-1)

请改用此意图过滤器,

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

<!-- Accepts URIs that begin with "example://gizmos” -->
<data
   android:host="gizmos"
   android:scheme="example" />
</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" />

<!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
<data 
    android:host="www.example.com"
    android:pathPrefix="gizmos"
    android:scheme="http" />
</intent-filter>