C2DM重试注册权限拒绝

3
非常感谢您的提问,关于如何解决重试注册事件中的权限拒绝错误,我们有以下建议:
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);
    }

所有一次性注册都非常出色!

1个回答

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>

现在一切都好了,虽然我不明白为什么这样做能解决问题,但显然它确实解决了!


这是由于android:permission属性导致的。正如文档所说(http://developer.android.com/guide/topics/manifest/receiver-element.html#prmsn),广播发送者必须具备该权限才能向广播接收器发送消息。 - Romain Guidoux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接