Как зарегистрировать некоторое пространство имен URL (myapp: //app.start/) для доступа к вашей программе, вызывая URL в браузере в ОС Android? - PullRequest
51 голосов
/ 12 марта 2010

Итак, я хочу создать приложение для Android, чтобы оно было зарегистрировано где-то в операционной системе Android (или просто запустилось бы при запуске системы), и когда пользователь телефона нажимает специальную кнопку на веб-странице в веб-браузере, например: *

 <a href="myapp://mysettings">Foo</a> 

мое приложение всплыло бы и запустилось с использованием параметров, отправленных в этом URL.

Так как мне сделать такую ​​вещь?

Мне нужен учебник с кодом!

Ответы [ 4 ]

55 голосов
/ 03 ноября 2010

Во-первых, чтобы иметь возможность запустить приложение по ссылке с пользовательской схемой «myapp» в браузере / почте, установить фильтр намерений следующим образом.

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

и для разбора запросов по вашей ссылке myapp: // someaction /? Var = str & varr = string
(код слишком упрощен и не содержит ошибок).

Intent intent = getIntent();
// check if this intent is started via custom scheme link
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  // may be some test here with your custom uri
  String var = uri.getQueryParameter("var"); // "str" is set
  String varr = uri.getQueryParameter("varr"); // "string" is set
}

[править] если вы используете пользовательскую схему для запуска приложения, одна из проблем заключается в следующем: WebView в других приложениях может не понимать вашу пользовательскую схему. Это может привести к отображению страницы 404 для этих браузеров по ссылке с пользовательской схемой.

48 голосов
/ 12 марта 2010

Вы должны следовать стандартным правилам для URI через W3C и т. Д., Что в основном означает: не делайте этого.

Android определяет синтаксис Uri для описания общего намерения. В Intent есть методы для преобразования в и из этого представления, такие как: http://developer.android.com/reference/android/content/Intent.html#toUri(int)

Таким образом, способ сделать это - использовать обычные средства для описания в вашем манифесте типов намерений, которые вы собираетесь обрабатывать с определенным компонентом, особенно путем определения имени действия в вашем собственном пространстве имен (com.mycompany. myapp.action.DO_SOMETHING или что угодно). Затем вы можете создать Intent, соответствующий вашему компоненту, и использовать Intent.toUri (), чтобы получить URI-представление этого. Это может быть помещено в вашу ссылку, а затем при нажатии будет искать что-то, что обрабатывает и, таким образом, найти ваше приложение. Обратите внимание, что компонент, запускаемый из браузера, должен обрабатывать категорию BROWSABLE. (Вам не нужно указывать это в намерении, указанном в ссылке, браузер автоматически добавит это для вас.)

Наконец, вы можете установить пакет намерений для вашего приложения с помощью: http://developer.android.com/reference/android/content/Intent.html#setPackage(java.lang.String)

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

В итоге: прочитайте обычную документацию о намерениях и фильтрах намерений (например, учебник NotePad, хотя вы не будете использовать контент: здесь URI, возможно, просто настраиваемые действия) и заставьте ваше приложение работать таким образом. Затем вы можете сделать ссылку на браузер для запуска вашего приложения таким же образом, если ваш фильтр намерений обрабатывает категорию BROWSABLE.

42 голосов
/ 13 апреля 2011

Вот мой вклад в погоню.

Создайте фильтр намерений в действии, которое вы хотите загрузить в манифест, следующим образом:

<intent-filter>
    <action android:name="com.bubblebeats.MY_CUSTOM_ACTION" />
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>

URL вашей веб-страницы для этого будет выглядеть так:

intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end

Самый простой HTML-код для запуска вашего apk из браузера будет выглядеть так:

<body>
    <a href="intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end">click to load apk</a>
</body>

Чтобы добавить переменные в ваше намерение

Вы можете сгенерировать URI из своего кода Android следующим образом:

Intent i = new Intent();

i.setAction("com.bubblebeats.MY_CUSTOM_ACTION");
i.putExtra("some_variable", "123456");

Log.d("ezpz", i.toUri(Intent.URI_INTENT_SCHEME));

Это даст:

04-13 09:47:30.742: DEBUG/ezpz(9098): intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end

Вы просто хотите эту часть:

intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end

Внимательно посмотрите, что здесь произошло, и вы увидите, как можно пропустить шаг кода и вручную создать эти URI.

Особенно эта часть:

S.some_variable=123456
9 голосов
/ 02 сентября 2015

Поскольку hackbod никогда не давал нам примеры кода, я просто хочу поделиться своим, после того, как я заставил это работать.

Прежде всего, вам нужно определить пользовательское действие в файле манифеста:

<activity
    android:name=".activity.MainActivity"
    android:label="@string/app_name_full">
    <intent-filter>
        <action android:name="com.yourpackage.action.OPEN_VIEW"></action>
        <category android:name="android.intent.category.DEFAULT"></category>
        <category android:name="android.intent.category.BROWSABLE"></category>
    </intent-filter>
</activity>

Затем для контента на вашем сайте вам нужно сгенерировать URI из намерения. Поместите следующий код в свою активность (этот код может быть удален после создания ссылки):

Intent i = new Intent();
        i.setAction("com.yourpackage.action.OPEN_VIEW");
        i.setPackage("com.yourpackage");
        i.putExtra("myextra","anystring");
        Log.d(getClass().getSimpleName(), i.toUri(Intent.URI_INTENT_SCHEME));

Чтобы получить Дополнения, добавьте в свое действие следующее, которое может получить пользовательское действие (как определено в манифесте):

final Intent intent = getIntent();
final String action = intent.getAction();

        if ("com.yourpackage.action.OPEN_VIEW".equals(action)) {
           Log.i(getClass().getSimpleName(), "EXTRA: "+intent.getExtras().getString("myextra"));
        }

На вашем сайте (это ранее созданная ссылка):

<a href="intent:#Intent;action=com.yourpackage.action.OPEN_VIEW;package=com.yourpackage;S.myextra=anystring;end">Open App with extra</a>

Надеюсь, это поможет кому-то лучше понять. Пожалуйста, поправьте меня, если я что-то не так понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...