【问题标题】:How to block an incoming message in android?如何在android中阻止传入的消息?
【发布时间】:2012-02-21 13:26:23
【问题描述】:

我正在尝试在 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>

【问题讨论】:

  • 显示你到目前为止工作的代码
  • 有什么方法可以阻止默认应用发出的短信?

标签: android broadcastreceiver sms


【解决方案1】:

这是我用来阻止传入文本的方法。


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>

从清单中删除的主要内容是服务块、接收器块和权限。

【讨论】:

  • 您可以在处理意图之前中止BroadCast()。我将它放在 onReceive() 之上,因为我所做的一切都会以相同的方式工作(意图保持在那里),但我确信,无论我的 onReceive 在被杀死之前设法工作多长时间,广播确实会被中止。跨度>
【解决方案2】:

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

【讨论】:

  • 我已经按照你的建议做了,但我仍然收到通知并且消息没有被阻止
  • 我也有这个问题。有什么想法吗?
【解决方案3】:

您的清单中存在问题,您在接收者标签之前关闭了&lt;application&gt; 标签,这是错误的。所有组件都应该在一个应用标签内。

您的班级名称是 Sm​​sReceiver,在清单中您声明为 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
                 }
            }
        }
  }

【讨论】:

  • 如果您仍然没有收到任何广播,请检查您的接收器所在的包名称,如果它与您在清单中声明的​​主包名称不同,然后为您的接收器提及带有包的完整类名在清单中。
  • 如果在移动应用程序标签后也无法正常工作,请发布您的新清单以及这些更改。
  • @sankar 广播已收到,但仍显示在默认短信应用程序中。
【解决方案4】:

@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>

【讨论】:

  • 我通过发布对我有用的代码来编辑我的答案,一旦检查并与您的代码进行比较。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多