Android, отказ в разрешении с использованием намерения BOOT_COMPLETED

У меня есть BootReceiver, и я использую android.intent.action.BOOT_COMPLETED для перенастройки любых сигналов тревоги, которые пользователь сделал в моем приложении, до того, как телефон был выключен.

Я использую AlarmManager, чтобы снова установить будильник. Аварийные сигналы хранятся в базе данных SQLite.

public class BootReceiver extends BroadcastReceiver {

private Context mContext;   

@Override
public void onReceive(Context c, Intent intent) {
    mContext = c;

try {
        cursor.moveToFirst();
        do {
            Intent i = new Intent(mContext, AlarmReceiver.class);
            i.putExtra("alarm_message", cursor.getInt(1));
            PendingIntent pendingIntent  = PendingIntent.getBroadcast(mContext, (int)System.currentTimeMillis(), intent, PendingIntent.FLAG_ONE_SHOT);
            AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, cursor.getLong(4), pendingIntent);
            Log.e("DB", "Future alarms was set after reboot");
        } while (cursor.moveToNext());
    } catch (Exception e1) {
        Log.e("DB", "DB is empty");
    }
    cursor.close();

Но когда вот-вот произойдет тревога, logcat выдает мне следующее:

Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=-1, uid=10067
Unable to send startActivity intent
W/ActivityManager(1584): java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=-1, uid=10067
02-19 23:42:26.989: W/ActivityManager(1584):    at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:10310)
02-19 23:42:26.989: W/ActivityManager(1584):    at com.android.server.am.ActivityManagerService.broadcastIntentInPackage(ActivityManagerService.java:10587)
02-19 23:42:26.989: W/ActivityManager(1584):    at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:228)
02-19 23:42:26.989: W/ActivityManager(1584):    at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:177)
02-19 23:42:26.989: W/ActivityManager(1584):    at android.app.PendingIntent.send(PendingIntent.java:400)
02-19 23:42:26.989: W/ActivityManager(1584):    at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:692)

Пока что единственное, что у меня есть в моем классе AlarmReceiver.class, это:

public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Log.v("AlarmReceiver", "Alarm received");

У меня есть все необходимые разрешения

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

и установите приемники:

<receiver android:name=".AlarmReceiver"></receiver>
<receiver android:name=".BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

Я видел примеры этого с успехом, но не могу избавиться от этого отказа в разрешении. Что мне не хватает?


person Jakob Klein Petersen    schedule 19.02.2012    source источник


Ответы (1)


@Override
public void onReceive(Context c, Intent intent) {

    ...

    Intent i = new Intent(mContext, AlarmReceiver.class);
    i.putExtra("alarm_message", cursor.getInt(1));
    PendingIntent pendingIntent  = PendingIntent.getBroadcast(mContext, (int)System.currentTimeMillis(), intent, PendingIntent.FLAG_ONE_SHOT);

    ...
}

В своем BootReceiver вы создаете PendingIntent и передаете ему Intent, полученный onReceive(...) — посмотрите на третий параметр getBroadcast(...) выше.

Я предполагаю, что вы хотите передать i в качестве этого параметра, а не intent.

person Squonk    schedule 19.02.2012
comment
Да, каким-то образом вы ретранслируете намерение Receive_boot, и это дает вам ошибку, поскольку это намерение системы. - person Peterdk; 20.02.2012
comment
Превосходно! Вы, конечно, правы, заменив намерение на i, это решило проблему. - person Jakob Klein Petersen; 20.02.2012
comment
Но это не работает в Android 10, пожалуйста, дайте альтернативное решение - person prototype86; 19.09.2020