Android: фильтрация намерений для определенного шаблона Uri

Мне нужно, чтобы мое приложение для Android запускало определенное действие в моем приложении, отвечая на следующие данные Uri из отправленного намерения:

http://www.example.com/redirect.aspx?customurl=example%3a%2f%2f%3fop%3dexampledetail%26stuff%3d12345%26morestuff%3dI%2520Love%25Android

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

<intent-filter>
 <action android:name="android.intent.action.VIEW" />
 <data android:scheme="http" android:host="www.example.com" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

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

Может ли кто-нибудь помочь мне сделать это?


person Christopher Perry    schedule 05.11.2010    source источник
comment
Я публикую это только как комментарий, а не ответ, так как на самом деле я просто размышляю (я еще не занимался программированием для Android), но я думаю, что вы всегда получите выбор, если есть другое приложение который может реагировать на одно и то же намерение (в частности, на браузер в вашем случае), пока пользователь не скажет всегда использовать этот. Возможно, использование пользовательской схемы URI позволит избежать этого?   -  person Laurence Gonsalves    schedule 06.11.2010
comment
Я предполагаю, что это будет достигнуто с помощью pathPattern или pathPrefix.   -  person Christopher Perry    schedule 06.11.2010
comment
Конкретная схема URI действительно решает проблему, к сожалению, мне приходится иметь дело с DoubleClick, поэтому схема ДОЛЖНА быть http.   -  person Christopher Perry    schedule 16.11.2010


Ответы (2)


Похоже, вы имеете дело с данными, которые поступают из вашего собственного приложения, поэтому не используйте свой «частный» URL-адрес в качестве цели намерения, а создайте намерение для конкретного компонента и укажите URL-адрес ваших данных в качестве ДОПОЛНИТЕЛЬНОГО параметра.

Что-то типа:

Uri privateUri = Uri.parse("http://yourserver.com/path/to/data");
Intent i = new Intent(context, yourActivity.class);
i.putExtra("DATA_URI", privateUri);
startActivity(i);

В yourActivity.class вам просто нужно получить Uri со следующим кодом:

Uri privateUri = (Uri) getIntent().getParcelableExtra("DATA_URI");
person Kevin Gaudin    schedule 16.11.2010
comment
На самом деле данные поступают не из моего приложения, а из Ad SDK, который создает неявное намерение с действием VIEW при нажатии на определенное объявление. Я пытаюсь обойти средство выбора и обработать намерение в своем приложении. - person Christopher Perry; 16.11.2010
comment
Если вы не являетесь инициатором намерения, вы не сможете этого сделать. Все намерения с ACTION_VIEW и схемой http должны быть представлены пользователю с выбором браузера. Как было представлено CommonsWare, предоставление приложениям возможности беспрепятственно перехватывать HTTP-намерения было бы огромной дырой в безопасности, позволяющей заменить платежные или банковские (например) URL-вызовы вредоносным программным обеспечением. - person Kevin Gaudin; 16.11.2010

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

На большинстве устройств Android будет установлено более 1 браузера. Пользователь может посетить этот URL-адрес в одном из этих браузеров, а не в вашем приложении, поэтому появляется средство выбора. Более того, было бы серьезной дырой в безопасности, если бы разработчики могли захватить любой URL-адрес HTTP, который они хотели.

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

person CommonsWare    schedule 05.11.2010
comment
Это пользовательский URL-адрес, на который никто не будет переходить. Это просто данные, которые передаются намерению в виде URL-адреса. - person Christopher Perry; 06.11.2010
comment
@Scienceprodigy: Тогда почему вы используете URL-адрес HTTP, если на самом деле это не URL-адрес HTTP? - person CommonsWare; 06.11.2010
comment
@Scienceprodigy: я не знаю, что вы пытаетесь сделать, кроме вашего вопроса. То, что вы пытаетесь сделать, очевидно, может быть сделано, как вы сказали, что сделали это в своем вопросе. Тем не менее, пользователь получит право выбора. Это неизбежно, если вы используете URL-адрес HTTP. Если это просто данные, которые передаются намерению в виде URL-адреса, не используйте URL-адрес HTTP. Используйте менее спорный вариант, например intent URL. См. commonsware.com/sample (третий пункт) и github.com/commonsguy/cw-advandroid/tree/master/Introspection/ для примера. - person CommonsWare; 16.11.2010
comment
@CommonsWare: Короткий ответ: я имею дело с DoubleClick, и они не примут пользовательскую схему, это должен быть http. - person Christopher Perry; 16.11.2010
comment
Scienceprodigy: Я скажу так: как ОС должна знать априори, что ваш URL-адрес не является тем, к чему следует переходить, а вместо этого должен обрабатываться вашим приложением? Насколько известно, это обычный URL-адрес HTTP. - person Yuliy; 16.11.2010
comment
@Scienceprodigy: Тогда нет, то, что вы хотите, вероятно, невозможно, по крайней мере, без выбора. Имейте в виду, что это может также нарушать условия предоставления услуг DoubleClick, поскольку я должен думать, что они будут косо смотреть на все, что блокирует клики по их объявлениям. - person CommonsWare; 16.11.2010
comment
Рекламная кампания моя, так что это будет для конкретного объявления, которое я хочу преобразовать в действие в своем приложении. DoubleClick требует схемы http, отсюда и моя дилемма. Если они позволят мне указать собственную схему, моя проблема исчезнет. - person Christopher Perry; 16.11.2010
comment
@Scienceprodigy: так что это будет для конкретного объявления - не с таким синтаксисом URL, которого не будет. То, что уникально для вас, находится не в пути, а в параметрах, которые ни в коем случае не фильтруются в Android. - person CommonsWare; 16.11.2010