3

这是一个场景。我的应用有

  • BroadcastSenderActivity
  • 样本广播接收器

我正在使用该sendBroadcast(intent, permission)方法发送我的广播,因为我只希望我的 SampleBroadcastReceiver 接收广播消息并阻止我的应用程序中的其他接收器接收消息。

注意:所有接收者都注册了相同的操作,但在广播时,根据系统条件,消息将以不同的权限进行广播。

从文档中我了解到我需要清单中的以下内容:

  1. 需要<permission android:name="com.example.MYPERMISSION" android:label="my_permission" android:protectionLevel="normal"></permission> 在manifest中声明

  2. 让这个 stmt 请求应用程序级别的权限<uses-permission android:name="com.example.MYPERMISSION"/>

问题-

  • 除了应用程序级别的权限请求,我如何只为我的应用程序中的特定组件请求权限?例如。SampleBroadcastReceiver(参见下面的代码)。可能吗?*

  • <android-permission>可用于所有单个组件的标签的目的是什么?它可以达到我的目的吗?

    AndroidManifest

        .........
    

    <activity
          android:name="com.example.activities.BroadcastSenderActivity"
          android:label="BroadcastSenderActivity"
          android:theme="@android:style/Theme.Light" >
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
    </activity>
    
    <!-- **************************************  RECEIVER ******************************************* -->
    <receiver android:name="com.example.broadcastTest.SampleBroadcastReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="com.example.ACTION_BROADCAST_SEND" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.example.broadcastTest.BroadcastReceiver_1"
        android:exported="false">
        <intent-filter>
            <action android:name="com.example.ACTION_BROADCAST_SEND" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.example.broadcastTest.BroadcastReceiver_2"
        android:exported="false">
        <intent-filter>
            <action android:name="com.example.ACTION_BROADCAST_SEND" />
        </intent-filter>
    </receiver>
    


    public class BroadcastSenderActivity extends Activity {

public BroadcastSenderActivity() {

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(Logger.TAG, "BroadcastSenderActivity - onCreate");
    setContentView(R.layout.broadcast_tester);
    Button btn = (Button)findViewById(R.id.sendBroadcastBtn);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent broadcastIntent = new Intent();
            Log.d(Logger.TAG, "BroadcastSenderActivity - sending the broadcast");
            broadcastIntent.setAction(com.example.ACTION_BROADCAST_SEND);
            BroadcastSenderActivity.this.sendBroadcast(broadcastIntent, com.example.MYPERMISSION);
4

1 回答 1

7

您可以使用特定权限保护每个单独的组件。这是android:permission="..."可以单独应用于每个组件的属性。这允许您要求不同的权限,例如,启动特定的Activity、启动特定的Service或使用特定的BroadcastReceiver。该属性表示应用程序需要持有指定的权限才能使用特定的组件。

应用程序拥有一组权限。<uses-permission>标签在清单中请求这些权限。安装应用程序时会向用户显示此列表,并且在安装时授予应用程序这些权限。

当您发送广播时,通常所有已安装和/或注册BroadcastReceiver的 s 都能看到此广播。当您使用该方法时sendBroadcast(intent, permission),该permission参数用于控制哪些接收者能够看到广播。但是,此权限检查也在应用程序级别完成。这意味着如果一个应用程序被授予了指定的权限,那么所有该应用程序的BroadcastReceivers都将能够看到广播。

因此,您想要做的事情是无法使用 Android 权限机制的。由于应用程序具有或不具有特定权限,因此您无法对特定应用程序可以使用哪些组件进行细粒度控制。

希望这能回答你的问题。

编辑:替代建议:

由于这一切都在一个应用程序中,您应该能够自己管理它。就个人而言,我认为为此使用 Android 权限框架是矫枉过正的。您可以在广播中添加适当的额外Intent内容,并使用它来控制对接收器的访问。或者,您可以定义 2 个不同的Intent操作,并使用它来控制访问。

于 2013-05-29T14:16:12.057 回答