Сделать ссылку в браузере Android запустите мое приложение?
Можно ли создать ссылку, например:
<a href="anton://useful_info_for_anton_app">click me!</a>
заставляет приложение Anton работать?
Я знаю, что это работает для приложения Android Market с рыночным протоколом, но что-то подобное можно сделать с другими приложениями?
Вот пример ссылки, которая запустит Android Market:
<a href="market://search?q=pname:com.nytimes.android">click me!</a>
Update:
Ответ, который я принял, предоставленный eldarerathis, отлично работает, но я просто хочу упомянуть, что у меня были некоторые проблемы с порядком подэлементов тега <intent-filter>
. Я предлагаю вам просто сделать еще один <intent-filter>
с новыми подэлементами в этом теге, чтобы избежать проблем, которые у меня были. Например, мой AndroidManifest.xml
выглядит следующим образом:
<activity android:name=".AntonWorld"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<data android:scheme="anton" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Ответы
Ответ 1
Я думаю, вам нужно посмотреть на элемент <intent-filter>
вашего файла Mainfest. В частности, посмотрите документацию для подэлемента <data>
.
В принципе, вам нужно будет определить свою собственную схему. Что-то вроде:
<intent-filter>
<data android:scheme="anton" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
...
</intent-filter>
Затем вы сможете запустить приложение со ссылками, начинающимися с схемы URI anton:
.
Ответ 2
Пожалуйста, НЕ используйте свою собственную подобную схему!!! Схемы URI представляют собой глобальное пространство имен в сети. У вас есть схема "anton:" по всему миру? Нет? Тогда НЕ используйте его.
Один из вариантов - иметь веб-сайт и иметь фильтр намерений для определенного URI на этом веб-сайте. Например, это то, что Market делает для перехвата URI на своем веб-сайте:
<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="market.android.com"
android:path="/search" />
</intent-filter>
В качестве альтернативы существует схема "намерение:". Это позволяет вам описать практически любое намерение как URI, которое браузер попытается запустить при нажатии. Чтобы построить такую схему, лучший способ - просто написать код для создания намерения, который вы хотите запустить, а затем распечатать результат намерения .toUri(Intent.URI_INTENT_SCHEME).
Вы можете использовать действие с этим намерением, чтобы найти какое-либо действие, поддерживающее это действие. Браузер автоматически добавит категорию BROWSABLE к намерению перед ее запуском по соображениям безопасности; он также будет лишать какой-либо явный компонент, который вы поставили по той же причине.
Лучший способ использовать это, если вы хотите, чтобы он запускал только ваше приложение, - это ваше собственное действие с областью действия и использование Intent.setPackage(), чтобы сказать, что намерение будет соответствовать вашему приложению.
Компромиссы между двумя:
-
http URI требуют наличия у вас домена. Пользователь всегда будет иметь возможность показывать URI в браузере. Он имеет очень хорошие свойства возврата, если приложение не установлено, они просто приземлятся на вашем веб-сайте.
-
Устройства URI требуют, чтобы ваше приложение уже было установлено и только на телефонах Android. Разрешить почти любые намерения (но всегда включать категорию BROWSABLE и не поддерживать явные компоненты). Они позволяют вам запускать запуск только для вашего приложения, не имея возможности вместо этого переходить в браузер или любое другое приложение.
Ответ 3
Я прошу прощения за продвижение себя, но у меня есть плагин jQuery для запуска собственных приложений из веб-ссылок https://github.com/eusonlito/jquery.applink
Вы можете легко использовать его:
<script>
$('a[data-applink]').applink();
</script>
<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>
Ответ 4
Я также столкнулся с этой проблемой и увидел множество абсурдных страниц. Я узнал, что для просмотра вашего приложения, изменения порядка элементов XML, это:
<activity
android:name="com.example.MianActivityName"
android:label="@string/title_activity_launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<data android:scheme="http" />
<!-- or you can use deep linking like -->
<data android:scheme="http" android:host="xyz.abc.com"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Это помогло мне и помогло вам.
Ответ 5
После того, как у вас есть намеренная и настраиваемая схема URL для вашего приложения, этот код javascript в верхней части страницы-получателя работал у меня как на iOS, так и на Android:
<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
navigator.userAgent.match(/android/i)) {
var store_loc = "itms://itunes.com/apps/raditaz";
var href = "/iphone/";
var is_android = false;
if (navigator.userAgent.match(/android/i)) {
store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
href = "/android/";
is_android = true;
}
if (location.hash) {
var app_loc = "raditaz://" + location.hash.substring(2);
if (is_android) {
var w = null;
try {
w = window.open(app_loc, '_blank');
} catch (e) {
// no exception
}
if (w) { window.close(); }
else { window.location = store_loc; }
} else {
var loadDateTime = new Date();
window.setTimeout(function() {
var timeOutDateTime = new Date();
if (timeOutDateTime - loadDateTime < 5000) {
window.location = store_loc;
} else { window.close(); }
},
25);
window.location = app_loc;
}
} else {
location.href = href;
}
}
</script>
Это было протестировано только в браузере Android. Я не уверен в Firefox или Opera. Ключ, несмотря на то, что браузер Android не выдает вам приятного исключения на window.open(custom_url, '_blank')
, он не сработает и вернет null
, который вы можете проверить позже.
Обновление: используя store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
для связи с Google Play на Android.
Ответ 6
Вот мой рецепт:
Создайте статический HTML-код, который перенаправляется на ваш запрошенный URL-адрес приложения, помещает эту страницу в Интернет.
Таким образом, ссылки, которыми вы делитесь, являются "реальными" ссылками в отношении Android (они будут "clickable" ).
Вы делитесь 'обычной HTTP-ссылкой, www.your.server.com/foo/bar.html
Этот URL-адрес возвращает простой 8-строчный HTML-код, который перенаправляет на URI вашего приложения (window.location = "blah://kuku" ) (обратите внимание, что "blah" больше не должен быть HTTP или HTTPS).
Как только вы начнете работать, вы можете увеличить HTML-код со всеми фантастическими возможностями, как было предложено выше.
Это работает со встроенным браузером, Opera и Firefox (не проверял какой-либо другой браузер). Firefox спрашивает: "Эта ссылка должна быть открыта приложением" (ok, cancel). Другие браузеры, похоже, не очень беспокоятся о безопасности, они просто открывают приложение, никаких вопросов не задают.
Ответ 7
Возможно, вам захочется рассмотреть библиотеку для обработки глубокой ссылки на ваше приложение:
https://github.com/airbnb/DeepLinkDispatch
Вы можете добавить фильтр намерений в аннотированную активность, как указано выше. Он будет обрабатывать маршрутизацию и анализ параметров для всех ваших глубоких ссылок. Например, ваша MainActivity может иметь что-то вроде этого:
@DeepLink("somePath/{useful_info_for_anton_app}")
public class MainActivity extends Activity {
...
}
Он также может обрабатывать параметры запроса.
Ответ 8
Попробуйте мой простой трюк:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.startsWith("classRegister:")) {
Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
}
view.loadUrl(url);
return true;
}
и моя ссылка html:
<a href="classRegister:true">Go to register.java</a>
или вы можете сделать < a href= "classRegister: true" > < - "true" значение для имени файла класса
однако этот script работает для mailto link:)
if (url.startsWith("mailto:")) {
String[] blah_email = url.split(":");
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
startActivity(emailIntent);
}