Как зарегистрировать некоторое пространство имен 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>
Надеюсь, что это помогает кому-то для лучшего понимания. Пожалуйста, поправьте меня, если я что-то не так понял.