Как открыть приложение из ссылки, не спрашивая пользователя о выборе между браузером или приложением, просто сразу откройте мое приложение

У меня есть этот intent-filter который я хочу, чтобы каждый раз, когда пользователь нажимал ссылку на eeexample.com, чтобы открыть мое приложение:

<intent-filter>
    <data android:scheme="http" />
    <data android:scheme="http" android:host="eeexample.com"/>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

Когда пользователь нажимает eeexample.com в приложении Gmail, например: enter image description here

Который затем открывает диалоговое окно, которое спрашивает пользователя, хотят ли они открыть эту ссылку из моего приложения или браузера следующим образом:

enter image description here

Но я просто хочу, чтобы, когда пользователь щелкает ссылку, он открывает ТОЛЬКО мое приложение, ничего не спрашивая. Или, в худшем случае, просто попросить открыть его с моим приложением, а это Appetit, а не с браузером. Это возможно?

Обновить

Таким образом, кажется, что это возможно сделать со ссылками на приложения, но только для API уровня 23 (Android 6.0), но мне нужно это для API уровня 15 (Android 4.0), есть идеи?

Ответ 1

Обход диалога устранения неоднозначности возможен только с помощью API Android 6.0 для привязки приложений.

В соответствии с тренингом "Ссылки на приложение":

Android 6.0 (уровень API 23) и выше позволяют приложению назначать себя обработчиком по умолчанию для данного типа ссылок. Если пользователь не хочет, чтобы приложение было обработчиком по умолчанию, он может переопределить это поведение в настройках.

Автоматическая обработка ссылок требует сотрудничества разработчиков приложений и владельцев сайтов. Разработчик должен настроить свое приложение так, чтобы оно объявляло ассоциации с одним или несколькими веб-сайтами и запрашивало у системы проверку этих связей. Владелец веб-сайта, в свою очередь, должен предоставить эту проверку путем публикации файла ссылок на цифровые активы.

Это включает в себя создание соответствующего обработчика намерений и включение автоматической проверки путем добавления android:autoVerify="true":

<activity ...>

  <intent-filter android:autoVerify="true">
    <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.android.com" />
    <data android:scheme="https" android:host="www.android.com" />
  </intent-filter>

</activity>

Затем необходимо выполнить обновления на стороне веб-сайта, объявив об ассоциации веб-сайта, что гарантирует, что владелец веб-сайта и разработчик приложения будут координировать свои действия, чтобы приложение автоматически становилось по умолчанию для схемы URL-адресов.

Ответ 2

Вот несколько мест, которые вы можете использовать, чтобы убедиться, что .well-known/assetlinks.json доступен, что является важной предпосылкой для удаления диалога устранения неоднозначности.

https://developers.google.com/digital-asset-links/tools/generator

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://YOUR_WEBSITE&relation=delegate_permission/common.handle_all_urls

Что касается моего случая, несмотря на все проверки, диалог устранения неоднозначности просто не исчезнет. Оказалось, что я также использовал FirebaseUI Auth для GitHub (https://github.com/firebase/FirebaseUI-Android/tree/master/auth), который использует firebase_web_host; если он определил что-то отличное от значения, определенного в android:host, то android:autoVerify также завершится ошибкой.

Проблема была в том, что firebase_web_host был похоронен где-то за пределами моего кода, поэтому было не совсем понятно, почему android:autoVerify не android:autoVerify. Один простой способ узнать это - проверить adb log при установке приложения; вы должны увидеть что-то вроде

IntentFilterIntentSvc: Verification .. complete. Success:true. Failed hosts:.

Если вы видите Success:false, он должен показывать, какие хосты вышли из строя, так что это должно дать вам подсказку, где искать.

Ответ 3

все, что вы сделали, это правильно, просто измените https и http другим словом wirte 'app' пример данных android: схема = "приложение" android: host = "com" android: pathPrefix = "/easy"

http или https означает, что запустить браузер, а затем вызвать конфликт

Ответ 4

в вашем AndroidManife.xml положить

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

например

 <activity
        android:name="Activity"
        android:exported="true"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
            <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>
 </activity>

после этого при нажатии на любой URL со схемой "myAPP" ваше приложение будет открываться. Нет пользовательских запросов.

например URL

MYAPP://yoursite.com

MYAPP://any.site.com

Ответ 6

Итак, вот один из способов сделать это, но по моему опыту я не уверен на 100%, что он всегда работает: поскольку, если какое-либо другое приложение также использует тот же механизм настройки приоритета, то это может быть показано в списке предлагаемых приложений для ОС Android.

когда вы объявляете фильтр намерения отвечать на события, вы также можете установить приоритет как-то вроде

<intent-filter android:icon="drawable resource"
   android:label="string resource"
   android:priority="integer" >
 // some other properties
 </intent-filter>

приоритет предоставляет информацию о том, насколько способна деятельность реагировать на намерение, которое соответствует фильтру, относительно других действий, которые также могут реагировать на намерение. Когда намерение может быть обработано несколькими действиями с разными приоритетами.

обратите внимание, что Android будет рассматривать только те, у которых более высокие значения приоритета, в качестве потенциальных целей для намерения.

так что должно быть значением приоритета? Значение должно быть целым числом, например "100". Более высокие номера имеют более высокий приоритет. Значение по умолчанию равно 0. Значение должно быть больше -1000 и менее 1000.

-1000 - это SYSTEM_LOW_PRIORITY, а 1000 - SYSTEM_HIGH_PRIORITY

Вот некоторые из ссылок на документацию по android, которые могут помочь вам узнать больше -

intent-filter

больше о настройке приоритета

надеюсь, что это поможет! все лучшее

update обратите внимание, что, что бы вы ни делали, в первый раз вам нужно пройти шаг, на который пользователь выбирает, чтобы открыть приложение

Ответ 7

Добавление флага Intent.FLAG_ACTIVITY_NEW_TASK наверняка поможет:

Uri location = Uri.parse(deeplink);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Ответ 8

В андроиде вы не можете заставить ссылку открываться из определенного приложения без подтверждения пользователя.

Как только пользователь нажмет "Всегда" со следующего раза, ваше приложение будет открыто