2011-10-14 52 views
3

有关如何解决此权限拒绝错误重试注册事件的任何想法,非常感谢。C2DM重试注册权限拒绝

Permission Denial: broadcasting Intent { act=com.google.android.c2dm.intent.RETRY flg=0x4 (has extras) } from com.my.package (pid=-1, uid=10041) requires com.google.android.c2dm.permission.SEND due to receiver com.my.package/com.google.android.c2dm.C2DMBroadcastReceiver 

清单

<uses-sdk android:minSdkVersion="8" /> 
    <permission android:name="com.my.package.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.SEND" /> 
    <uses-permission android:name="com.my.package.permission.C2D_MESSAGE" /> 
    <application android:name=".Sims3" android:icon="@drawable/icon" 
     android:label="@string/app_name"> 
     <provider android:name=".QuizProvider" android:authorities="com.my.package.QuizModel"/> 
     <service android:name=".C2DMReceiver" /> 
     <service android:enabled="true" android:name=".RegService" /> 
     <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND"> 
      <!-- Receive the actual message --> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.my.package" /> 
      </intent-filter> 
      <!-- Receive the registration id --> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <category android:name="com.my.package" /> 
      </intent-filter> 
      <!-- Handle retry events --> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RETRY"/> 
       <category android:name="com.my.package" /> 
      </intent-filter> 
     </receiver> 
... 

,设置重试了

if ("SERVICE_NOT_AVAILABLE".equals(error)) { 
     long backoffTimeMs = C2DMessaging.getBackoff(context); 

     Log.d(TAG, "Scheduling registration retry, backoff = " + backoffTimeMs); 
     Intent retryIntent = new Intent(C2DM_RETRY); 
     PendingIntent retryPIntent = PendingIntent.getBroadcast(context, 
       0 /*requestCode*/, retryIntent, 0 /*flags*/); 

     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + backoffTimeMs, 
       retryPIntent); 

     // Next retry should wait longer. 
     backoffTimeMs *= 2; 
     C2DMessaging.setBackoff(context, backoffTimeMs); 
    } 

所有有利于这项工作首次登记的代码!

回答

4

问题解决 我需要重试事件一个单独的接收申报舱单我

<receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND"> 
     <!-- Receive the actual message --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="com.my.package" /> 
     </intent-filter> 
     <!-- Receive the registration id --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
      <category android:name="com.my.package" /> 
     </intent-filter> 
    </receiver> 
    <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver" 
     <!-- Handle retry events --> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RETRY"/> 
      <category android:name="com.my.package" /> 
     </intent-filter> 
    </receiver> 

所有现在是很好的,虽然我不明白为什么这会解决它显然不会的问题!

+0

这是因为android:permission属性。正如文档所述(http://developer.android.com/guide/topics/manifest/receiver-element.html#prmsn),广播公司必须拥有该权限才能向广播接收方发送消息。 –