Android,使用BOOT_COMPLETED意图拒绝权限 [英] Android, permission denial using BOOT_COMPLETED intent
问题描述
我有一个BootReceiver,并且正在使用android.intent.action.BOOT_COMPLETED重新配置用户在关闭手机电源之前在我的应用中发出的任何警报。
I have a BootReceiver and is using android.intent.action.BOOT_COMPLETED to reconfigure whatever alarms the user made in my app, before phone was powerd off.
Im使用AlarmManager再次设置警报。警报存储在SQLite数据库中。
Im using AlarmManager to set the alarms again. The alarms are stored in a SQLite database.
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会给我这样的提示:
But when alarm is about to occur, the logcat gives me this:
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中唯一拥有的是:
So far, the only thing I have in my AlarmReceiver.class is:
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>
在此期间,我见过成功的例子,但不能摆脱Permisson的否认。我缺少什么?
I've seen exampels of during this with succes, but cannot get rid of that Permisson denial. What am I missing?
推荐答案
@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(...)
的第三个参数。
In your BootReceiver
you are creating a PendingIntent
and passing it the Intent
that is received by onReceive(...)
- look at the third parameter of getBroadcast(...)
above.
我猜你是要传递 i
作为该参数,而不是 intent
。
I'm guessing you mean to pass i
as that parameter rather than intent
.
这篇关于Android,使用BOOT_COMPLETED意图拒绝权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!