setPackage для намерения в прянике

Согласнодокументация для Android:

Кроме того, начиная с ICE_CREAM_SANDWICH, вы также можете безопасно ограничить трансляцию одним приложением с помощью Intent.setPackage.

Есть ли способ в Gingerbread (возможно, с использованием библиотеки совместимости) ограничить событие sendBroadcat () так, чтобы оно отправляло его только в указанный пакет?

Ответы на вопрос(3)

Решение Вопроса

LocalBroadcastManager если вообще возможно. Это позволяет полностью игнорировать любые проблемы безопасности.

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

Тем не менее ... если вы готовы указать явное имя пакета, почему бы просто не пройти весь путь и использоватьIntent.setComponent ()?

Также имейте в виду, что даже setPackage () или setComponent () автоматически не полностью безопасны - вы по-прежнему предполагаете, что знаете, кто реализует это имя пакета, и это вполне возможно для приложения, отличного от ожидаемого. быть установлен через боковую загрузку, даже если у вас есть имя в магазине Play.

 Ben12 мар. 2012 г., 17:24
да, в моем случае я могу гарантировать, что приложения - это то, что я знаю. Мы создаем пользовательское устройство Android и боковая загрузка отключена.

setPackage был представлен в API Level 4, но, возможно, произошло изменение структуры, которое делает его функционирование другим / лучше в ICS Как насчет создания собственногоФильтр намерений что ваши получатели узнают? Пример NotePad в нижней частиэта страница показывает пример: в манифесте пример NoteEditor указывает

<action android:name="com.android.notepad.action.EDIT_NOTE" />

который является пользовательским действием, определяемым приложением.

 Ben21 февр. 2012 г., 02:02
проблема в том, что любое приложение может определить фильтр намерений с тем же действием. тогда как setPackage фактически ограничит его пакетом приложения, который, я могу быть уверен, не будет подделывать (в моем конкретном контексте)

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

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

Чтобы обеспечить разрешение при отправке, вы задаете ненулевой аргумент разрешения дляsendBroadcast(Intent, String) или жеsendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle), Только получатели, которым было предоставлено это разрешение (запросив его с тегом в своем AndroidManifest.xml), смогут получать трансляцию.

 Ben21 февр. 2012 г., 10:47
из того, что я могу сказать, нет никакого способа создать настраиваемое разрешение в вещателе, которое будет знать о приложении, которое будет предназначено для setPackage. Я заметил, что есть способ запрашивать разрешения, но я почти уверен, что это уровень ОС или вы знаете, как мое приложение может отвечать на эти запросы и предоставлять / запрещать доступ к моим пользовательским разрешение?

Ваш ответ на вопрос