Вот моя история. У меня есть приложение для Android, которое разделяет ссылку на мой сайт. на устройствах Android. Я хочу проверить, есть ли у пользователя приложение Android для Android и показать соответствующий контент по этой ссылке, но если у меня нет моего приложения, открывайте эту ссылку в браузере. Я использую DeepLinkDispatch для этого, но у меня есть проблема, когда пользователь нажимает на общую ссылку, андроид попросит клиенту выбрать, какое приложение открыть эту ссылку (включая мое приложение), но я хочу заставить открыть свое приложение. (если установлено на устройстве)Force open android app через схему
ответ
Это невозможно до Android 6.0.
В Android 6.0+ вы можете использовать automatic verification of app links, чтобы запросить, чтобы ваше приложение обрабатывало определенные URL-адреса, когда они используются в ACTION_VIEW
Intents
.
Однако:
Веб-браузер не должен использовать
ACTION_VIEW
для URL. Веб-браузер можно просто загрузить веб-страницу, указанную в URL-адресе.Не знаю, работает ли проверка ссылок на приложение для
Intent
действий, кромеACTION_VIEW
. Ваш вопрос предполагает, что URL-адрес может использоваться вместоACTION_SEND
.Пользователи могут войти в Настройки и не допустить, чтобы ваше приложение обрабатывало URL-адреса.
спасибо, я понимаю, но у меня есть другой вопрос, когда я открываю канал канала телеграммы, он идет на сайт и автоматически открывает мобильное приложение, не спрашивая клиента. так что мой вопрос, как это работает? (даже на android pre 6.0) –
@MostafaDavodi: единственный способ открыть ссылку в приложении, которая «гарантирована» только для этого приложения, - это если ссылка не выполняется ничем другим. Поскольку все URL-адреса 'http' и' https' будут выполняться веб-браузерами, это означает, что вам нужно будет использовать собственную схему (например, 'телеграмма'). Telegram, в частности, имеет действия, которые поддерживают схемы tg и tgb. Однако многие приложения не будут соблюдать такие URL-адреса. Например, клиент SMS может не признать, что 'tg: // ...' является URL-адресом и делает его доступным для кликов. – CommonsWare
@MostafaDavodi: Что еще более важно, это не поддерживает ваши требования («но если у меня нет моего приложения, открывайте эту ссылку в браузере»). Веб-браузер может попробовать попробовать «ACTION_VIEW» для запуска приложения, когда он встречает ссылку на URL-адрес «tg: // ...». Однако, если для этого не установлено приложение, браузер не имеет возможности автоматически сопоставить это с каким-либо URL-адресом https, чтобы открыть веб-страницу. – CommonsWare
Вы должны определить намерения категории, по умолчанию и просматриваемый с андроид: схемы, андроид: хозяин и Android: PATHPREFIX в деятельности умысел фильтра в файле манифеста с учетом действия. Например, если URL-адрес: «http://www.example.com/gizmos». На основе хоста, схемы и префикса пути в андроиде данных обнаружено намерение, которое может обрабатывать URL-адрес. Чтобы включить os, чтобы найти свое намерение, вы должны добавить в приложение следующий фильтр.
<activity
android:name="com.example.android.GizmosActivity"
android:label="@string/title_gizmos" >
<intent-filter android:label="@string/filter_title_viewgizmos">
<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:scheme="http"
android:host="www.example.com"
android:pathPrefix="/gizmos" />
<!-- note that the leading "/" is required for pathPrefix-->
<!-- Accepts URIs that begin with "example://gizmos” -->
<data android:scheme="example"
android:host="gizmos" />
</intent-filter>
Тест глубокую связь: Вы можете проверить Deeplink из оболочки следующим образом:
adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/gizmos" packageIDofYourApp
Вы можете поковыряться на deplinking в developer site
Проверьте, если ваше приложение может получить намерение Вы можете проверить, может ли ваше приложение обрабатывать намеренно имея конкретный адрес, используя диспетчер пакетов:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com/gizmos"));
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
System.out.println("print pack:"+ ((isIntentSafe == true) ? activities.get(0).activityInfo.packageName : "No package found"));
Я реализую эту часть, я просто хочу заставить устройство открыть мое приложение, не прося клиенту выбрать его. –
попытайтесь изменить свой вопрос, трудно понять, что вы на самом деле после. –