Android uri package name

URI (Uniform Resource Identifier)

URI — это специальный идентификатор, по которому можно определить абстрактный или физический ресурс. Самый понятный пример с URI — это обычная веб-страница. Возьмём к примеру страницу http://developer.alexanderklimov.ru/android/catshop/catshop.php. Данный адрес можно разбить на несколько частей:

  • Scheme — http
  • Scheme-specific part — //developer.alexanderklimov.ru/android/catshop/catshop.php
  • Path — /android/catshop/

У протокола http есть и другие параметры, которые рассматривать не будем. Существует также протокол ftp, имеющий свои параметры. Ниже вы увидите другие примеры. Главное здесь — возможность определить нахождение ресурса по представленным данным.

Допустим, мы хотим загрузить видеоматериал в компонент VideoView. Само видео может находиться в ресурсах программы или на SD-карте. С помощью URI мы можем подсказать программе, откуда следует загрузить файл.

Например, если видеофайл playcat.3gp находится в папке /res/raw, то получить адрес для загрузки можно следующим образом:

Если файл хранится на внешней карточке, то код будет следующим (опустим правильное определение имени карточки):

У компонента VideoView есть метод setVideoURI(URI uri), в котором нужно указать объект класса URI:

Посмотрим на другие примеры:

Координаты

Метод uri.getScheme() вернёт geo, а метод uri.getSchemeSpecificPart()54.354183,37.34011.

Номер телефона

В данном случае метод uri.getScheme() вернёт tel, а uri.getSchemeSpecificPart() — 1234578.

Контакты

URI также используется при работе с контент-провайдерами, в частности, с контактами.

Источник

Полный список

— узнаем, что такое Uri и Intent-атрибут data
— вызываем системные приложения (браузер, звонилка, карта)

Мы знаем, что Intent имеет атрибут action. С помощью этого атрибута обычно дается указание действия. Например, просмотр или редактирование. Но действие обычно совершается не просто так, а с чем-либо. Значит кроме указания действия, мы должны указывать на объект, с которым эти действия нужно произвести. Для этого Intent имеет атрибут data.

Один из способов присвоения значения этому атрибуту – метод setData (Uri data) у объекта Intent. На вход этому методу подается объект Uri.

Uri – это объект, который берет строку, разбирает ее на составляющие и хранит в себе эту информацию. Строка, конечно, должна быть не любая, а составлена в соответствии с этим документом RFC 2396. Uri имеет кучу методов, которые позволяют извлекать из распарсенной строки отдельные элементы.

Я создам объект Uri из строки, а в лог буду выводить название метода и (через двоеточие) значение, которое он возвращает. Например возьмем такую строку — http адрес:

Смотрим, чего нам возвращают методы:

uri.getScheme(): http
uri.getSchemeSpecificPart(): //developer.android.com/reference/android/net/Uri.html
uri.getAuthority(): developer.android.com
uri.getHost(): developer.android.com
uri.getPath(): /reference/android/net/Uri.html
uri.getLastPathSegment(): Uri.html

Понятия Scheme, Authority, Host, Path и пр. – взяты из RFC дока, ссылку на который я дал выше. Там можно найти их полное описание, понять что они означают и свериться с тем, что нам вернул Uri.

Рассмотрим еще примеры:

(Код, написанный выше, идет одной строкой на самом деле. Здесь идут пробелы вокруг @ из-за особенностей разметки)

uri.getScheme(): ftp
uri.getSchemeSpecificPart(): // Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. :80/data/files
uri.getAuthority(): Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. :80
uri.getHost(): google.com
uri.getPort(): 80
uri.getPath(): /data/files
uri.getLastPathSegment(): files
uri.getUserInfo(): bob

uri.getScheme(): geo
uri.getSchemeSpecificPart(): 55.754283,37.62002

Здесь уже получилось выделить только Scheme и SchemeSpecificPart.

Аналогично, получилось выделить только две части из строки.

Контакт из адресной книги

uri.getScheme(): content
uri.getSchemeSpecificPart(): //contacts/people/1
uri.getAuthority(): contacts
uri.getPath(): /people/1
uri.getLastPathSegment(): 1

В этом примере Scheme равен content. Это особый тип данных – Content Provider. Он позволяет любой программе давать доступ к своим данным, а другим программам – читать и менять эти данные. Эту тему мы рассмотрим позднее, и сами будем создавать такой тип данных.

Здесь можно посмотреть какие стандартные Uri поддерживаются.

Примеры показывают, что Uri можно создать из абсолютно разных строк: http-адрес, ftp-адрес, координаты, номер телефона, контакт из адресной книги.

Тип содержимого можно определить по Scheme. И этот же Scheme можно настроить в Intent Filter и отсеивать Intent, только с нужным нам типом данных в Uri, например только http. Этим мы еще займемся позднее, а пока сделаем простой пример, в котором будем формировать Intent с action и data, отправлять его и смотреть, что получится. Попробуем просмотреть следующее: http-адрес, координаты на карте и открыть окно набора номера.

Читайте также:  Чистим андроид через компьютер

Чтобы посмотреть координаты на карте, необходимо приложение Google Maps. Его нет в стандартных образах Android систем (тех, что вы в SDK Manager скачивали). Нужен образ, название которого начинается с «Google APIs»

Создайте AVD на платформе Google APIs с API Level 10. Назовите его на ваше усмотрение.

Создадим проект. Обратите внимание, используем платформу Google APIs версии 2.3.3

Project name: P0311_SimpleIntents
Build Target: Google APIs 2.3.3
Application name: SimpleIntents
Package name: ru.startandroid.develop.p0311simpleintents
Create Activity: MainActivity

Если у вас не получилось установить Google APIs, то создавайте проект как обычно — с платформой Android 2.3.3. Просто не будет работать вызов Google Maps в этом примере.

Сформируем экран main.xml

На экране три кнопки. Первая будет открывать веб-страницу, вторая — карту, третья – звонилку.

Пишем код в MainActivity.java:

Я использовал три разных способа создания Intent-а и задания его атрибутов.

В случае btnWeb я использовал конструктор Intent (String action, Uri uri). Он создает Intent и на вход сразу принимает action и data. Мы используем стандартный системный action – ACTION_VIEW. Это константа в классе Intent – означает, что мы хотим просмотреть что-либо. В качестве data мы подаем объект Uri, созданный из веб-ссылки: http://developer.android.com. И если попытаться описать словами наш код, то получится так: этот Intent означает, что мы хотим посмотреть содержимое этой ссылки и ищем Activity, которая могла бы нам помочь.

В случае btnMap использовался конструктор Intent(). Он просто создает Intent. А в следующих строках мы уже присваиваем ему атрибуты action и data. action – снова ACTION_VIEW, а в качестве data мы создаем Uri из пары координат — 55.754283,37.62002. Этот Intent означает, что мы хотим посмотреть на карте указанные координаты.

В случае btnCall используем конструктор Intent (String action). На вход ему сразу подается action, а data указывается позже. action в данном случае – ACTION_DIAL – открывает звонилку и набирает номер, указанный в data, но не начинает звонок. В data – помещаем Uri, созданный из номера телефона 12345.

Три этих способа приводят к одному результату — Intent с заполненными атрибутами action и data. Какой из них использовать — решать вам в зависимости от ситуации.

Т.к. нашему приложению понадобится интернет, чтобы открыть ссылку и посмотреть карту, надо чтобы на вашем компе интернет был.

Также в файле манифеста приложения, на вкладке Permission добавьте элемент Uses Permission и справа в поле Name выберите android.permission.INTERNET. Это даст приложению доступ в интернет. Правда у меня почему-то и без этого все работает … Пока не понял почему.

Все сохраняем и запускаем приложение

Жмем кнопку Web,

открывается стандартный браузер и отображает содержимое страницы по ссылке

Возвращаемся, жмем Map. Отображается карта, которая показывает место, соответствующее указанным координатам.

Возвращаемся, жмем Call. Отображается стандартный экран набора номера и видим, что номер, который мы указывали в data, уже набран. Нам остается только нажать кнопку звонка.

Скорее всего, сейчас есть много вопросов типа «Что будет если … ». На некоторые из них сразу могу ответить и предлагаю вам поэкспериментировать в текущем приложении:

1) Что будет, если указать координаты без приставки geo:

Система ругнется, что не нашла подходящего Activity (см. логи). Т.к. в Activity карты настроен Intent Filter, который (как я думаю) настроен на data c Schema = geo.

Аналогично не сработает звонилка, если указать номер без приставки tel.

2) Что будет, если в координатах оставить geo, но координаты указать кривые?

Если мы попробуем посмотреть, например, такие координаты geo:a,b, то карта запустится, но скажет нам Unable to load the URL. Т.е. данные подошли по Schema, но оказались некорректными.

3) Что будет, если координаты указать верно, но action использовать не ACTION_VIEW, а ACTION_EDIT.

Получается, что мы хотим отредактировать место на карте заданное этими координатами. Но система говорит нам, что она не нашла такое Activity. Потому что приложение Google Maps ожидает Intent с action = ACTION_VIEW и оно сможет показать нам это место на карте. А на редактирование оно не подписывалось )

Читайте также:  Как посмотреть последние уведомления андроид

Необходимо понять, что все приложения в системе заточены под конкретные действия с конкретными типами данных. И если вы попробуете позвонить на адрес сайта, или открыть на карте номер телефона – то система просто не найдет приложения, способные на это.

На следующем уроке:

— пишем простой браузер

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Связывание приложений в Android

В этом руководство показано, как в Android 6.0 используется методика связывания приложений, что позволяет мобильным приложениям реагировать на URL-адреса веб-сайтов. Вы узнаете, что такое связывание приложений, как реализовать связывание приложений в приложении Android 6.0 и как настроить на веб-сайте доступ к домену для мобильного приложения.

Общие сведения о связывании приложений

Мобильные приложения больше не находятся в приемнике. во многих случаях они являются важными компонентами их бизнеса, а также их веб-сайтом. Предприятиям нужна возможно легко объединять решения для веб-репрезентации с мобильными приложениями, чтобы ссылки на веб-сайте могли запускать мобильные приложения и отображать в них соответствующее содержимое. Связывание приложений (также называется глубинное связывание) — это один из методов, позволяющих мобильному устройству реагировать на URI и запускать соответствующее мобильное приложение.

Android управляет компоновкой приложений через систему с намерением , когда пользователь щелкает ссылку в браузере мобильного устройства, браузер мобильного устройства будет отправлять намерение, что Android будет делегировать зарегистрированному приложению. Например, щелчок по ссылке на кулинарном веб-сайте открывает мобильное приложение, связанное с этим веб-сайтом, и отображает для пользователя конкретный рецепт. Если для работы с этим намерением зарегистрировано несколько приложений, Android отобразит так называемый диалог устранения неоднозначности, в котором пользователю предлагается выбрать приложение, которое будет обрабатывать это намерение, например так:

Android 6.0 улучшает этот механизм, применяя автоматическую обработку ссылок. Android может автоматически зарегистрировать приложение в качестве обработчика по умолчанию для URI — приложение автоматически запустится и будет переходить к соответствующему действию. Android 6.0 принимает решения об обработке URI по следующим критериям:

  1. Существующее приложение уже связано с URI — пользователь уже связан с существующим приложением с URI. В этом случае Android продолжит использовать это приложение.
  2. С универсальным кодом ресурса (URI) не связано существующее приложение, но для него установлено вспомогательное приложение — в этом сценарии пользователь не указал существующее приложение, поэтому Android будет использовать установленное поддерживающее приложение для выполнения запроса.
  3. С URI не связано ни одно существующее приложение, но установлено множество поддерживаемых приложений , так как существует несколько приложений, поддерживающих универсальный код ресурса (URI), отображается диалоговое окно устранения неоднозначности, и пользователь должен выбрать приложение, которое будет обрабатывать универсальный код ресурса (URI).

Если у пользователя нет установленных приложений, поддерживающих универсальный код ресурса (URI), а затем он установлен, то Android задаст это приложение как обработчик по умолчанию для URI после проверки связи с веб-сайтом, связанным с URI.

В этом руководстве показано, как настроить приложение Android 6.0, а также создать и опубликовать файл ссылок на цифровые ресурсы для поддержки связывания приложений в Android 6.0.

Требования

Для работы с этим руководством требуется Xamarin.Android 6.1 и приложение, предназначенное для использования Android 6.0 (API уровня 23) или выше.

Связывание приложений в более ранних версиях Android реализуется через пакет NuGet Rivets из магазина компонентов для Xamarin. Пакет Rivets не совместим с механизмом связывания приложений в Android 6.0 и не поддерживает этот механизм.

Настройка связывания приложений в Android 6.0

Настройка связывания приложений в Android 6.0 включает два основных этапа.

  1. Добавление одного или нескольких фильтров с намерением для URI веб-сайта — фильтры намерений Android в разделе как управлять URL-адресом щелкните в браузере мобильного устройства.
  2. Публикация файла JSON с ссылками на цифровые активы на веб-сайте — это файл, который загружается на веб-сайт и используется Android для проверки связи между мобильным приложением и доменом веб-сайта. Без этого Android не сможет установить приложение в качестве маркера по умолчанию для URI; пользователь должен сделать это вручную.
Читайте также:  Надо ли обновлять андроид самсунг

Настройка фильтра намерений

Вам нужно настроить фильтр намерений, который сопоставляет URI (или даже набор из нескольких URI) некоторого веб-сайта с действием в приложении Android. В Xamarin. Android это отношение устанавливается путем оформления действия с помощью интентфилтераттрибуте. Фильтр намерений должен объявлять следующую информацию:

  • Intent.ActionView — Будет зарегистрирован фильтр намерения для реагирования на запросы на просмотр сведений.
  • Categories — Фильтр намерения должен зарегистрировать Categories и намерения. категоридефаулт , чтобы иметь возможность правильно обрабатывать URI веб-сайта.
  • DataScheme — Фильтр намерения должен объявлять http и (или) https . Существует только две допустимые схемы.
  • DataHost — Это домен, из которого берутся URI.
  • DataPathPrefix — Это необязательный путь к ресурсам на веб-сайте.
  • AutoVerify — autoVerify Атрибут указывает Android проверить связь между приложением и веб-сайтом. Этот механизм мы подробнее обсудим позже.

В следующем примере показано, как использовать интентфилтераттрибуте для управления ссылками из и из http://www.recipe-app.com/recipes :

Android сверит все узлы, которые указаны в фильтрах намерений, с файлом цифровых ресурсов на веб-сайте, прежде чем зарегистрировать приложение в качестве обработчика по умолчанию для этого URI. Все фильтры намерений должны пройти проверку, прежде чем Android применит приложение как обработчик по умолчанию.

Создание файла ссылок на цифровые ресурсы

Для связывания приложений в Android 6.0 требуется, чтобы Android проверял все связи между приложением и веб-сайтом, прежде чем устанавливать приложение в качестве обработчика по умолчанию для URI. Такая проверка выполняется при первой установке приложения. Файл ссылок на цифровые ресурсы имеет формат JSON и размещается на всех соответствующих поддоменах.

android:autoVerify Атрибут должен быть установлен фильтром намерения, иначе Android не будет выполнять проверку.

Этот файл размещается веб-мастером домена по адресу https://domain/.well-known/assetlinks.json .

Файл цифровых ресурсов содержит метаданные, необходимые для проверки связи платформой Android. Файл assetlinks.json содержит следующие пары «ключ — значение»:

  • namespace — пространство имен приложения Android.
  • package_name — имя пакета приложения Android (объявлено в манифесте приложения).
  • sha256_cert_fingerprints — отпечатки SHA256 подписанного приложения. Дополнительные сведения о получении отпечатков SHA1 для приложения см. в статье Отображение MD5 и SHA1 сигнатур хранилища ключей.

Ниже приведен пример файла assetlinks.json, где указано одно приложение:

Вы можете зарегистрировать боле одного отпечатка SHA256, чтобы поддерживать несколько версий или сборок приложения. В следующем файле assetlinks.json представлен пример регистрации нескольких приложений:

Веб-сайт Google по ссылкам на цифровые ресурсы предоставляет онлайн-средство для создания и тестирования файла цифровых ресурсов.

Тестирование связывания приложений

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

Вы можете убедиться, что файл цифровых ресурсов имеет правильный формат и правильно размещен, используя API Google для ссылок на цифровые ресурсы, как показано в этом примере:

Существует два теста, которые можно выполнить для проверки правильности фильтров намерений и настройки приложения в качестве обработчика по умолчанию для URI.

Файл цифровых ресурсов правильно размещен, как описано выше. Первый тест отправляет намерение, которое система Android должна передать мобильному приложению. Приложение Android должно открыться и отобразить действие, зарегистрированное для этого URL-адреса. В командной строке введите следующее:

Отобразите существующие политики обработки ссылок для приложений, установленных на конкретном устройстве. Следующая команда выводит список политик для каждого пользователя на устройстве с указанной здесь информацией. В командной строке введите следующую команду:

  • Package — Имя пакета приложения.
  • Domain — Домены (разделенные пробелами), веб-ссылки которых будут обрабатываться приложением;
  • Status — Текущее состояние обработки ссылок для приложения. Значение всегда означает, что приложение объявило и прошло проверку системы. После него указывается шестнадцатеричное число, обозначающее запись приоритета в системе Android.

Сводка

В этом руководстве описана методика связывания приложений в Android 6.0. Затем мы описали, как правильно настроить приложение Android 6.0 для включения поддержки ссылок и реагирования на них. Мы также обсудили, как протестировать связывание приложений для приложения Android.

Источник

Оцените статью