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

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

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

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

Итак, как мне это сделать?

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

<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

Ответ 4

Поскольку 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>

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