7

Я внедряю индексацию приложений, и я думаю, что у меня что-то не хватает, но я не знаю, что.Индексирование приложений Android и глубокие ссылки: я все время ошибался?

После guide Я добавил свои фильтры намерений в приложение и реализовал то, что необходимо в моей деятельности.

пакет моего приложения является com.towers.hotelsclick и связанный с ним веб-сайт (где я не ставил ссылку отн мета-тег еще, так как я просто тестирование) является www.hotelsclick.com

I увидел следующий пример намеренных фильтра в руководстве

<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.

Теперь в "testing your app" части документации, я увидел, что ссылки, как 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/намерение-фильтр/ContentProvider беспорядок.

Спасибо всем

+1

Эй, Марко, просто предложение сделать этот вопрос более читаемым: Пожалуйста, укоротите вопрос! Сократите нерелевантный флэг, плюс несколько вопросов внутри одного вопроса должны быть разбиты на список вопросов. –

ответ

5

Во-первых, убедитесь, что ваше приложение обрабатывает ваши 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-приложение обрабатывается должным образом (не имеет ничего общего), на телефоне, откройте 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" /> 

Это говорит Google, что страница может быть открыта в приложении, идентифицированной com.towers.hotelsclick с междунар чтобы просмотреть https://www.hotelsclick.com/?hotel_id=135738 (что-то, что вы только что протестировали).

+0

Здравствуйте, regisd, спасибо вам за ваши ответы. Прямо сейчас я могу запустить свою деятельность, выполнив adb shell am start -a android.intent.action.VIEW -d "https://www.hotelsclick.com?hotel_id=135738", но я не могу запустить его с помощью QR-кода , Появляется тост, говорящий: «Извините, мы не можем открыть эту ссылку. Не установлены приложения, которые могут ее обработать». Что делает мое приложение чувствительным к первому, а не к последнему? Спасибо. –

+0

Кроме того, я думаю, что раздел «hotel_id = 135738» не должен быть после косой черты. Поэтому я создал новую ссылку с ссылкой android-app://com.towers.hotelsclick/https/www.hotelsclick.com?hotel_id=135738. Это тоже не работает. Вот он: https://goo.gl/kOyLux –

+0

Да, я сгенерировал неправильный QR и добавил дополнительный '/'. – regisd