Как зарегистрировать некоторое пространство имен URL (myapp: // app.start /) для доступа к вашей программе путем вызова URL в браузере в ОС Android?
Итак, я хочу создать приложение для Android, чтобы оно было зарегистрировано где-нибудь в ОС Android (или просто запускалось при запуске системы) и когда пользователь телефона нажимает специальную кнопку на веб-странице внутри веб-браузера a la:
<a href="myapp://mysettings">Foo</a>
мое приложение всплывет и запустится, используя параметры, отправленные по этому URL.
Итак, как мне это сделать?
Мне нужен учебник с кодом!
Переведено автоматически
Ответ 1
Во-первых, чтобы иметь возможность запускать ваше приложение по ссылке с пользовательской схемой "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 страницы для этого браузера для ссылки с пользовательской схемой.
Ответ 2
Вам нужно следовать стандартным правилам для 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 этого. Это может быть помещено в вашу ссылку, а затем при нажатии будет искать что-то, что обрабатывает и, таким образом, найдет ваше приложение. Примечание для запуска из браузера подобным образом компонент должен обрабатывать категорию, доступную для просмотра. (Вам не нужно указывать это в намерении, которое вы вводите в ссылку, браузер автоматически добавит это за вас.)
Наконец, вы можете захотеть установить пакет намерений для вашего приложения следующим образом: http://developer.android.com/reference/android/content/Intent.html#setPackage (java.lang.Строка)
Это более новая функция платформы, которая позволяет вам направлять ссылки только на ваше приложение, чтобы другие приложения не могли их перехватывать и обрабатывать.
Вкратце: прочитайте обычную документацию по намерениям и фильтрам намерений (например, учебное пособие NotePad, хотя здесь вы не будете использовать content: URI, вероятно, просто пользовательские действия) и заставьте ваше приложение работать таким образом. Затем вы можете создать ссылку браузера для запуска вашего приложения таким же образом, при условии, что ваш фильтр намерений обрабатывает категорию, доступную для просмотра.
Ответ 3
Вот мой вклад в chase.
Создайте фильтр намерений в действии, которое вы хотите загрузить в манифест, следующим образом:
<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>
Надеюсь, это поможет кому-то лучше понять. Пожалуйста, поправьте меня, если я что-то понял неправильно.