如何在android中阻止传入的消息?

时间:2012-02-21 13:26:23

标签: android broadcastreceiver sms

我正在尝试在android中开发一个阻止传入短信的应用程序。我已经设置了优先级,但它没有阻止传入的短信。我也使用this.abortBroadcast()但没有结果。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;

import android.widget.Toast;

@SuppressWarnings("deprecation")
public class SmsReceiver extends BroadcastReceiver
{

@Override
public void onReceive(Context context, Intent intent) 
{
this.abortBroadcast();  

    Bundle bundle = intent.getExtras();        
    SmsMessage[] msgs = null;
    String str = "";

    if (bundle != null)
    {


        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];            
        for (int i=0; i<msgs.length; i++){
            msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
            str += "SMS from " + msgs[i].getOriginatingAddress();                     
            str += " :";
            str += msgs[i].getMessageBody().toString();
            str += "\n";        

}


}
}
}

并且清单文件就像这样

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="BVB.EDU"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".SMS"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

<receiver android:name=".SMSReceiver">
     <intent-filter android:priority="99999">
         <action android:name="android.provider.Telephony.SMS_RECEIVED" />                  
     </intent-filter>
 </receiver>

<uses-permission android:name="android.permission.SEND_SMS">
</uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>

</manifest>

5 个答案:

答案 0 :(得分:2)

abortBroadcast();块中添加if(bundle!=null){}。应该阻止它去其他应用程序。我注意到你的广播接收者的名字是SmsReceiver,但在Manifest中,你给它".SMSReceiver"(区分大小写)。

答案 1 :(得分:2)

问题出现在您的接收器之前的关闭<application>标签中,但不应该这样做,您必须在接收器后关闭应用程序标签。

您的类名是SmsReceiver,在您声明为SMSReceiver的清单中, 所以你根本不会为接收器播放广播。

使用必须在清单中更改您的班级名称,如下所示

 <receiver android:name=".SmsReceiver">
         <intent-filter android:priority="99999">
             <action android:name="android.provider.Telephony.SMS_RECEIVED" />                  
         </intent-filter>
     </receiver>
</application>

在您的接收器中,最好检查意图对象是否有消息,然后您可以中止它。

但要小心它会中止所有消息。如果你想根据一些特定的字符串中止消息,你可以对消息进行一些操作,然后你可以中止它。

如果要中止所有消息,可以在对该消息进行任何操作之前直接调用abortBroadcast()。

Bundle extras = intent.getExtras();        
 if ( extras != null )
    {
       // do you manipulation on String then if you can abort.
       if(somecondition){
       abortBroadcast();
       }
    }

这是我的清单,与您的代码相比,工作正常

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mypackage"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />    
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <application android:icon="@drawable/icon" android:enabled="true" android:label="@string/app_name">
        <service android:name="com.mypackage.service.MyService" android:exported="true">
        </service>
        <receiver android:name="com.mypackage.receiver.MyReceiver">        
        <intent-filter android:priority="100"><action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> 
        </receiver>
    </application>
</manifest>

和java代码

public void onReceive( Context context, Intent intent ) 
  {
     if(intent != null){               
         String action = intent.getAction();
         if(action.equals("android.provider.Telephony.SMS_RECEIVED"))  {
                Bundle extras = intent.getExtras();    
                if ( extras != null ){
                   //read sms
                 }
            }
        }
  }

答案 2 :(得分:2)

这是我用来阻止传入文本的内容。


SmsReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class BroadCastReceiver extends BroadcastReceiver 
{
/** Called when the activity is first created. */
private static final String ACTION = "android.provider.Telephony.SEND_SMS";
public static int MSG_TPE=0;
public void onReceive(Context context, Intent intent) 
{ 
    String MSG_TYPE=intent.getAction();
        if(MSG_TYPE.equals("android.provider.Telephony.SMS_RECEIVED"))
    {
//          Toast toast = Toast.makeText(context,"SMS Received: "+MSG_TYPE , Toast.LENGTH_LONG);
//          toast.show();

    Bundle bundle = intent.getExtras();
    Object messages[] = (Object[]) bundle.get("pdus");
    SmsMessage smsMessage[] = new SmsMessage[messages.length];
    for (int n = 0; n < messages.length; n++) 
    {
        smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
    }

    // show first message
    Toast toast = Toast.makeText(context,"BLOCKED Received SMS: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG);
    toast.show();
        abortBroadcast();
        for(int i=0;i<8;i++)
        {
            System.out.println("Blocking SMS **********************");
        }

    }
    else if(MSG_TYPE.equals("android.provider.Telephony.SEND_SMS"))
    {
        Toast toast = Toast.makeText(context,"SMS SENT: "+MSG_TYPE , Toast.LENGTH_LONG);
        toast.show();
        abortBroadcast();
        for(int i=0;i<8;i++)
        {
            System.out.println("Blocking SMS **********************");
        }

    }
    else
    {

        Toast toast = Toast.makeText(context,"SIN ELSE: "+MSG_TYPE , Toast.LENGTH_LONG);
        toast.show();
        abortBroadcast();
        for(int i=0;i<8;i++)
        {
            System.out.println("Blocking SMS **********************");
        }

    }

}

}

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="APP.PACKAGE.NAMEHERE"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="10" />

<supports-screens 
android:largeScreens="true" 
android:normalScreens="true" 
android:smallScreens="true" 
android:resizeable="true" 
android:anyDensity="true" />

<uses-feature android:name="android.hardware.telephony" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".APPACTIVITYHERE"
        android:label="@string/app_name"
        android:configChanges="orientation|keyboardHidden" >


    <service android:name=".MyService" android:enabled="true"/>
     <receiver android:name="SmsReceiver">
      <intent-filter android:priority="2147483647">
       <action android:name="android.provider.Telephony.SMS_SENT"/>
      </intent-filter>
     </receiver>

     <service android:name=".MyServiceSentReceived" android:enabled="true"/>
      <receiver android:name="SmsReceiver">
        <intent-filter android:priority="2147483645">
         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
      </receiver>

</application>

从清单中拿走的主要内容是服务块,接收器块和权限。

答案 3 :(得分:0)

@sankar

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="BVB.EDU"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SMS"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="99999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />                  
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.SEND_SMS">
</uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>   
</manifest>

答案 4 :(得分:0)

由于Android 4.4及更高版本的安全策略          阻止它需要提供的传入SMS消息          申请“默认短信应用”的权限