Android,使用 BOOT_COMPLETED Intent 拒绝权限

标签 android broadcastreceiver alarmmanager

我有一个 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>

我已经看到在此期间取得成功的示例,但无法摆脱拒绝许可的情况。我错过了什么?

最佳答案

@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 并将其传递给 onReceive(...) 接收的 Intent - 查看上面 getBroadcast(...) 的第三个参数。

我猜你的意思是传递 i 作为参数而不是 intent

关于Android,使用 BOOT_COMPLETED Intent 拒绝权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9354360/

相关文章:

android - 如何处理垂直 RecyclerView 时间轴?

android - Android 多用户支持(4.2 中新增)对服务器端数据模型(例如 android_id)的影响

android - 如何在 Android 中捕获超过 80 字节的短信?

android - 将 gradle 设置为 Android O (API 26)

android - 文本输入在 Flex Mobile 项目中显示 block 而不是阿拉伯文本

android - WebView 直接下载返回使用原始文件扩展名的 HTML

android - 从 list 注册时未调用 BroadcastReceiver

Android 警报管理器工作,但延迟

android - 我应该在 AlarmManager 中使用 PendingIntent.getService() 还是 getBroadcast?

Android Intent 启动应用程序的主要 Activity