Намеренное пользовательское разрешение не работает
ОБНОВИТЬ
Моя непосредственная проблема решена согласно моему ответу ниже. Моя среда (ПК + устройства) не допускает пользовательских разрешений в сборках DEBUG.
Я убежден, что смог запустить сборки DEBUG несколько недель назад - отсюда и описание "периодической" ошибки.
ОБНОВЛЕНИЕ 2
Код, синхронизированный на компьютере другого разработчика, прекрасно работает на его устройстве в режиме отладки через Eclipse. На моих устройствах не работает со своей машины.
Кроме того, сборка DEBUG с моей машины отлично работает на этом другом устройстве.
Это приводит меня к вопросу, если что-то пошло не так на моих устройствах?
У меня периодически возникает проблема "Отказ в разрешении" с пользовательским разрешением Intents
, Это один из тех, где код находится в производстве и работает, но иногда при создании новых сборок он перестает работать. Мне только удалось исправить это по счастливой случайности, прежде чем, через процесс перезагрузки (устройство и компьютер), очистить проект, удалить / переустановить, повторить и т. Д... это недопустимо.
Насколько я вижу, я делаю все правильно для пользовательских разрешений на моем Intents
что я вещаю в моем приложении. Но logcat выдаёт мне обычные ошибки:
- W / BroadcastQueue (389): Отказ в разрешении: широковещательное намерение { act=A_ACTION flg=0x10 } из com.test (pid=22030, uid=10002) требует A_PERMISSION из-за зарегистрированного приемника BroadcastFilter{43918d50 u0 ReceiverList{4391cad8 22030 com.test/10002/u0 удаленный:430576d0}}
на 4.2.1 (Galaxy Nexus) и 4.2.2 (Nexus 7), или
- W/ActivityManager( 2002): Отказ в разрешении: получение намерения { act=A_ACTION flg=0x10 } для ProcessRecord{41a12748 31496:com.test/10115} (pid=31496, uid=10115) требует A_PERMISSION из-за отправителя com.test (UID 10115)
на 4.0 (S2) и 2.3.3 (Samsung Ace).
т.е. стандартные ошибки.
Мой манифест говорит:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test"
android:versionCode="1"
android:versionName="4.10.0.3" >
<permission
android:name="A_PERMISSION"
android:description="@string/broadcast_permission_desc"
android:label="@string/broadcast_permission_label"
android:permissionGroup="@string/broadcast_permission_group"
android:protectionLevel="signature" />
<uses-permission android:name="A_PERMISSION" />
etc.....
Эти строки определены как (fwiw):
<string name="broadcast_permission_label">Private Broadcast</string>
<string name="broadcast_permission_desc">This permission allows the necessary components of the application to receive private broadcasts that are sent within the application.</string>
<string name="broadcast_permission_name">A_PERMISSION</string>
<string name="broadcast_permission_group">A_GROUP</string>
У меня есть метод в моем базовом подклассе APPLICATION, который я использую для вещания:
public void sendBroadcast(Intent i)
{
// hardcoded custom permission
super.sendBroadcast(i, "A_PERMISSION");
}
Я РЕГИСТРАЦИЯ для моего BroadcastReceiver
изнутри Fragment
как это:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// hardcoded custom permission
MyApp.getInstance().registerReceiver(myReceiver, myFilter,
"A_PERMISSION", null);
}
Я проверил следующие связанные вопросы без радости:
- Отказ в разрешении Android: намерение вещания
- Как использовать пользовательские разрешения в Android?
- Как объявить пользовательские разрешения в Android
Я думаю, что охватывает аналогичные вопросы на этом сайте.
Моя проблема в том, что он прерывистый, но тратит много времени, т. Е. Некоторые сборки работают на всех телефонах, некоторые сборки не работают на всех телефонах.
Интересно, если это проблема в одной из платформ (либо ОС Android, или, возможно, Eclipse / Android SDK). К сожалению, поиск в Google приводит меня только к более распространенным проблемам с общими решениями.
1 ответ
Окончательное решение - я согласен, что это не имеет смысла, но вот оно:
У меня есть 2 приложения, использующие одно и то же разрешение - com.test
а также com.runtest
,
Как указано выше, com.test
был сломан для сборок DEBUG. Но я заметил, что com.runtest
все еще работал.
шаги:
- установлены
com.runtest
чтобы подтвердить, что это работает - удалили оба приложения с моих устройств
- переименованный
com.runtest
вcom.test
- в Eclipse (Инструменты Android... Переименовать пакет приложений) - отладил это переименованное приложение в Eclipse на моем устройстве - все заработало
- удалил это переименованное "подделка"
com.test
- отлаженный оригинал
com.test
приложение в Eclipse на моем устройстве - оно наконец заработало!
Поэтому по какой-то причине перезапись сломанного приложения работающим приложением что-то изменила и исправила мое устройство.