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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

<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

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

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

Другие вопросы по тегам