8

我正在实施应用程序索引,我认为我遗漏了一些东西,但我不知道是什么。

按照指南,我将我的意图过滤器添加到应用程序中,并实现了我的活动所需的内容。

我的应用程序包是 com.towers.hotelsclick 和相关的网站(我还没有放链接 rel 元标记,因为我只是在测试)是 www.hotelsclick.com

我在指南中看到了以下意图过滤器示例

<activity
  android:name="com.example.android.PetstoreActivity"
 android:label="@string/title_petstore">
    <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" />
        <data android:scheme="https" />
        <data android:host="www.examplepetstore.com" />
    </intent-filter>
</activity>

所以我用这种方式写了我的:

    <activity
        android:name=".ActivityForAppIndexing"
        android:label="@string/title_activity"
        android:screenOrientation="portrait" >
        <intent-filter android:label="@string/app_name">
            <data android:scheme="android-app"
                android:host="com.package.myappname" />
            <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.mywebsite.com" />
            <data android:scheme="https"
                android:host="www.mywebsite.com" />
        </intent-filter>
    </activity>

另外,我编写了一个内容提供程序来解析 URI

    <provider
        android:name=".contentproviders.HotelDetailsContentProvider"
        android:authorities="com.towers.hotelsclick" >
    </provider>

它应该按如下方式映射 URI:

    private static final String BASE_PATH = "https";
private static final String AUTHORITY = "com.towers.hotelsclick";

public static final Uri CONTENT_URI = Uri.parse("android-app://" + AUTHORITY
        + "/" + BASE_PATH);

我正在使用以下 adb 命令通过命令行测试实现:

adb shell am start -a android.intent.action.VIEW -d "https://hotelsclick.com?hotel_id=135738" com.towers.hotelsclick

它有效。该应用程序会使用正确的活动和正确的参数自动打开。当应用程序启动时onNewIntent方法被调用:

    protected void onNewIntent(Intent intent) {
    String action = intent.getAction();
    String data = intent.getDataString();
    if (Intent.ACTION_VIEW.equals(action) && data != null) {
        String recipeId = data.substring(data.lastIndexOf("/") + 1);
        Uri contentUri = HotelDetailsContentProvider.CONTENT_URI.buildUpon()
                .appendPath(recipeId).build();
        bundle = new Bundle();
        bundle.putString("pictureUrl", "");

        //showRecipe(contentUri);
    }
}

(我当然是从例子中得到的,这就是为什么它谈论食谱而不是酒店)

但我想知道:我该怎么办?从意图中获取数据

getIntent().getData().getQuery()

或使用 ContentProvider 并从 URI 获取它们?

此外,如果一切正常,我想使用 Google Search Console 和“以 Google 方式查看”功能进行测试。我上传了我的 APK 并看到请求了一个 URI。

现在,在文档的“测试您的应用程序”部分,我看到像http://hotelsclick.com?hotel_id=135738这样的链接被称为“深层链接”,而像 android-app://com.towers 这样的链接。 Hotelsclick/https/hotelsclick.com?hotel_id=135738 被称为“URI”。我对吗?

“以 google 方式查看”功能要求提供 URI,但我不知道如何创建。另外,我想知道这个 URI 是如何传递给应用程序的,我很确定我对这一切 URI/deepLink 的事情感到非常困惑,并且无法在文档中找到解脱。

我应该在何时何地使用 URI?我应该在何时何地使用 deepLink?我想既然我要将链接 rel=URI放在我的网页中,那么应用程序将在应用程序索引中调用 URI 而不是页面的 URL。但如果是这样......为什么adb shell am start -a android.intent.action.VIEW -d命令用于测试 URL 而不是 URI?我的应用程序是否应该能够获取和处理 URI 或 URL?如何?

我以为我对应用程序索引有所了解,但今天我开始认为我从一开始就搞错了。这就是为什么我要求您帮助回答上述问题,并可能阐明所有这些 URL/URI/intent-filter/ContentProvider 混乱。

谢谢大家

4

1 回答 1

8

首先,确保您的应用正确处理您的 URL:

adb shell am start \
  -a android.intent.action.VIEW \
  -d 'https://www.hotelsclick.com?hotel_id=135738'

还要检查是否可以使用可浏览类别打开活动:

adb shell am start \
  -a android.intent.action.VIEW \
  -c android.intent.category.BROWSABLE
  -d 'https://www.hotelsclick.com?hotel_id=135738'

如果这不起作用,请编辑您的意图过滤器以同时具有类别 DEFAULT 和 BROWSABLE,如下所示

<activity
  android:name="com.towers.hotelsclick.HotelActivity"
  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" />
        <data android:scheme="https" />
        <data android:host="www. hotelsclick.com" />
    </intent-filter>
</activity>

检查android-app链接是否处理正确(没有什么可做的),在你的手机上,打开android-app://com.towers.hotelsclick/https/www.hotelsclick.com?hotel_id=135738

android-app://com.towers.hotelsclick/https/www.hotelsclick.com?hotel_id=135738

如果可行,您唯一需要做的就是在您的 HTML 页面中添加

<link rel="alternate"
      href="android-app://com.towers.hotelsclick/https/www.hotelsclick.com?hotel_id=135738" />

这告诉谷歌该页面可以在由 标识的应用程序中打开,com.towers.hotelsclick以便查看https://www.hotelsclick.com/?hotel_id=135738(您刚刚测试过的东西)。

于 2016-02-16T19:43:24.660 回答