在同一个应用程序中强制执行A​​ndroid权限

时间:2013-05-28 19:52:21

标签: android android-intent android-activity broadcastreceiver android-permissions

这是一个场景。我的应用

  • BroadcastSenderActivity
  • SampleBroadcastReceiver

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

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

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

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

  2. 让此stmt请求申请级<uses-permission android:name="com.example.MYPERMISSION"/>的权限

  3. 问题 -

    • 我是如何仅为应用中的特定组件请求权限而不是应用级权限请求?例如。 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);
    

1 个答案:

答案 0 :(得分:6)

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

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

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

因此,使用Android权限机制无法实现您的目标。由于应用程序具有或没有特定权限,因此您无法对特定应用程序可以使用哪些组件进行细粒度控制。

希望这能回答你的问题。

编辑:替代建议:

由于这都在一个应用程序中,您应该能够自己管理它。就个人而言,我认为使用Android权限框架是有点过分的。您只需向广播Intent添加适当的额外,然后将其用于控制​​对接收者的访问。或者,您可以定义2个不同的Intent操作,并使用它来控制访问。