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