2012-02-19 11 views
1

私はBootReceiverを持っていて、アンドロイド.intent.action.BOOT_COMPLETEDを使用して、電話機の電源が切れる前に、ユーザーがアプリで行ったアラームを再設定します。Android、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> 

私は大成功との間に、こののexampelsを見てきましたが、それPermisson拒否を取り除くことはできません。私は何が欠けていますか?上記getBroadcast(...)の三番目のパラメータを見て - あなたのBootReceiverあなたがPendingIntentを作成し、それをonReceive(...)によって受信されIntentを渡しているに

答えて

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); 

    ... 
} 

intentではなく、iをそのパラメータに渡すことを意味しています。

+2

はい、何らかの理由でreceived_bootインテントを再ブロードキャストしています。これはシステムインテントであるため、エラーが発生しています。 – Peterdk

+0

優秀!あなたはもちろん、私とインテントを置き換えて、それを解決しました。 –

+0

@Jakob:喜んで助けてください。 – Squonk