接收android内部意图广播

时间:2014-04-03 17:51:43

标签: android android-intent

当我们点击android中的默认消息应用程序时会发生什么。我的意思是它是否广播了一个意图?实际上我正在尝试制作一个应用程序,当用户点击消息图标时会在新活动中要求输入密码,并且只有在密码正确时才被重定向到消息列表。但是我的活动没有显示。这就是我的尝试方式做它。在清单中添加一个接收器。

    <receiver android:name="Receiver">
      <intent-filter android:priority="100">
         <action android:name="android.intent.action.GET_CONTENT">
      </action>
      <action android:name="android.intent.action.VIEW" />
     <action android:name="android.intent.action.EDIT" />
     <action android:name="android.intent.action.PICK" />
     <category android:name="android.intent.category.DEFAULT" />
      <data android:mimeType = "vnd.android-dir/mms-sms" />
      </intent-filter>
   </receiver>

2 个答案:

答案 0 :(得分:0)

您在询问“发起”活动。通常,这是通过如此创建的意图完成的:

Intent launch = new Intent(Intent.ACTION_MAIN);
launch.setPackage("com.your.package.name");
startActivity(launch);

由于设置了包名称,因此无法拦截此意图。它不会向任何接收者广播。

如果你编写了一个启动器应用程序,你可以拦截这样的启动请求并在它前面启动一个不同的应用程序。但是,通过返回默认的Android启动器,不可能阻止用户踩到这一步。

但是,还有其他几种“启动”“默认”短信应用程序的方法。例如,通过默认SMS应用程序发送请求SMS的应用程序将创建如下意图:

Intent launch = new Intent("android.intent.action.SENDTO");

还有其他几个。您的应用可以在清单中注册这些意图的活动,如下所示:

    <activity                                     
              android:name="com.your.package.name.MyMessageActivity"
              android:configChanges="orientation|screenSize|keyboardHidden"
              >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="vnd.android-dir/mms-sms" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
       </intent-filter>
       <intent-filter>
           <action android:name="android.intent.action.SEND" />
           <category android:name="android.intent.category.DEFAULT" />
           <data android:mimeType="image/*" />
       </intent-filter>
    </activity>

在Android KitKat中,用户必须将您的应用程序实际设置为“默认SMS应用程序”,以便能够写入SMS提供程序/数据库并接收“SMS_DELIVER”意图。在Android的所有版本中,任何应用都可以注册“SMS_RECEIVED”意图但在KitKat +中它不能像早期版本一样中止。

您可能会注意到上面指定的一个过滤器与您的过滤器类似 - 使用mimeType "vnd.android-dir/mms-sms"作为“DEFAULT”操作。这会将您的应用程序作为用户选择“完成操作使用”的一个选项,例如,当他们选择要发送消息的联系人时。

如果您执行了所有这些操作,那么您的活动可能需要密码才能“查看”消息。但是,您应该知道,除非您为邮件使用单独的数据存储,否则可以通过MMS-SMS提供程序读取所有SMS(假设应用程序已请求许可)。

答案 1 :(得分:0)

您想要实现的目标是不可能的,请看到: https://stackoverflow.com/a/21469133/2452039

您无法阻止使用外部应用打开本机应用。您唯一能做的就是拦截收到的邮件,阻止它们到达SMS应用程序收件箱,并将它们存储在您的应用程序中,并且您可以阻止它们打开。我必须警告你,因为API级别19不再可能......