首页 > 解决方案 > 广播接收器中的权限拒绝

问题描述

我正在尝试从应用程序 B 到 A 的广播接收器,但由于错误消息似乎无法通信(见下文)。此外,我试图在这个论坛上搜索解决特定问题的答案,但由于情况不同,它们似乎对我没有帮助。

错误:

2019-03-28 07:24:23.973 1636-1650/? W/BroadcastQueue: Permission Denial: receiving Intent { act=com.example.cataloguemoviefinal.ACTION_UPDATE_WIDGET_DATA flg=0x30 } to com.example.cataloguemoviefinal/receiver.UpdateWidgetDataReceiver requires com.example.cataloguemoviefinal.UPDATE_WIDGET_DATA due to sender com.example.favoritefilmapp (uid 10147)

显现:

应用 A 中的权限:

<!-- Permission declaration for updating widget content -->
    <permission
        android:name="com.example.cataloguemoviefinal.UPDATE_WIDGET_DATA" />

应用 A 中的接收器:

<!-- Custom Broadcast receiver -->
        <receiver
            android:name=".receiver.UpdateWidgetDataReceiver"
            android:permission="com.example.cataloguemoviefinal.UPDATE_WIDGET_DATA"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.cataloguemoviefinal.ACTION_UPDATE_WIDGET_DATA"/>
            </intent-filter>
        </receiver>

应用 A 中的广播接收器:

public class UpdateWidgetDataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Log.d("Action intent", intent.getAction());

        if(intent.getAction() != null){
            if(intent.getAction().equals("com.example.cataloguemoviefinal.ACTION_UPDATE_WIDGET_DATA")){
                // Log message
                Log.d("Testing receiver", "I got ur updates");

                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

                int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, FavoriteMovieItemWidget.class));

                appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.favorite_movie_stack_view);
            }

        }
    }
}

应用 B 中的清单:

 <!-- This code is used for custom BroadcastReceiver -->
    <uses-permission android:name="com.example.cataloguemoviefinal.UPDATE_WIDGET_DATA"/>

App B 中的发送者消息:

// Intent for broadcast receiver
        Intent broadcastIntent = new Intent();
        // Add flags to intent which can be communicated with closed app package (idk if its true)
        broadcastIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
        // Set action
        broadcastIntent.setAction("com.example.cataloguemoviefinal.ACTION_UPDATE_WIDGET_DATA");
        // Sent broadcast to receiver (use permission)
        sendBroadcast(broadcastIntent, "com.example.cataloguemoviefinal.UPDATE_WIDGET_DATA");

我应该怎么做才能让广播接收器接收从应用 B 到 A 的消息(显示 Log.message)?

抱歉,如果我写了太多代码,但这些是可能出现错误的必要部分。

谢谢。

标签: androidpermissionsreceiver

解决方案


Android O 有一个隐式广播限制,你是在 Android o 或更高版本上运行的吗? https://developer.android.com/about/versions/oreo/background,搜索“广播限制”


推荐阅读