现在的位置: 首页 > 综合 > 正文

android 短信和电话拦截

2014年01月08日 ⁄ 综合 ⁄ 共 4242字 ⁄ 字号 评论关闭

短信拦截实现 

 
手机状态发生改变时,系统会发生各种广播。如电池信息、收到短信、接听电话等灯。如果要拦截手机的短信,只需要接受系统短信广播即可。短信广播属于有序广播,可以传递到下一个广接收者处理。如果需要屏蔽系统接收短信,只需要中断广播的传输。

短信广播  android.provider.Telephony.SMS_RECEIVED

1. 定义广播接收器
public class SmsReceiver extends BroadcastReceiver

    
@Override
public void onReceive(Context context, Intent intent)
{
// 如果是接收到短信 
        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))   
        {   
            // 取消广播(这行代码将会让系统收不到短信) 
            abortBroadcast();   
            StringBuilder sb = new StringBuilder();   
            // 接收由SMS传过来的数据 
            Bundle bundle = intent.getExtras();   
            // 判断是否有数据 
            if (bundle != null)   
            {   
                // 通过pdus可以获得接收到的所有短信消息 
                Object[] pdus = (Object[]) bundle.get("pdus");   
                // 构建短信对象array,并依据收到的对象长度来创建array的大小 
                SmsMessage[] messages = new SmsMessage[pdus.length];   
                for (int i = 0; i < pdus.length; i++)   
                {   
                    messages[i] = SmsMessage   
                        .createFromPdu((byte[]) pdus[i]);   
                }   
                // 将送来的短信合并自定义信息于StringBuilder当中 
                for (SmsMessage message : messages)   
                {   
                    sb.append("短信来源:");   
                    // 获得接收短信的电话号码 
                    sb.append(message.getDisplayOriginatingAddress());   
                    sb.append("\n------短信内容------\n");   
                    // 获得短信的内容 
                    sb.append(message.getDisplayMessageBody());   
                }   
            }   
            Toast.makeText(context, sb.toString()   
                , Toast.LENGTH_LONG).show();   
        }   

}

}

2.配置广播
 <receiver  
            android:name=".SmsReceiver" >
   <!--android:priority  广播接收优先级别 -->
            <intent-filter android:priority="800" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
            </intent-filter>
  </receiver >
  添加接收短信权限
  <uses-permission android:name="android.permission.RECEIVE_SMS"/> 

电话拦截
1.获取手机管理对象
final TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  

2. extends PhoneStateListener 监听手机状态
class MyPhoneStateListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String incomingNumber)

super.onCallStateChanged(state, incomingNumber);

switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
Log.i("CALL_STATE_IDLE", "无活动"+"  "+incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK: 
Toast.makeText(getApplicationContext(), "来电已经接听", Toast.LENGTH_SHORT).show();
Log.i("CALL_STATE_OFFHOOK", "摘机。"+"  "+incomingNumber); 
break;
case TelephonyManager.CALL_STATE_RINGING:
 
//当手机接收来电时,设置静音   
am.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
  

//正当模式 mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
Toast.makeText(getApplicationContext(), "来电已经拦截", Toast.LENGTH_SHORT).show();
Log.i("CALL_STATE_RINGING", "振铃"+"  "+incomingNumber);
 
break; 
}

}
}

3. 注册监听器 

telManager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);

//添加读取手机状态权限
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

测试类:

public class TestSmsActivity extends Activity

Button but = null;
AudioManager am = null;
 
@Override
protected void onCreate(Bundle savedInstanceState)

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

 
final TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  

   am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

but = (Button) findViewById(R.id.call);
but.setOnClickListener(new View.OnClickListener()
{

@Override
public void onClick(View v)
{
telManager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
 
Toast.makeText(getApplicationContext(), "拦截已开启", Toast.LENGTH_SHORT).show();
}
});
}

class MyPhoneStateListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String incomingNumber)

super.onCallStateChanged(state, incomingNumber);

switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
Log.i("CALL_STATE_IDLE", "无活动"+"  "+incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK: 
Toast.makeText(getApplicationContext(), "来电已经接听", Toast.LENGTH_SHORT).show();
Log.i("CALL_STATE_OFFHOOK", "摘机。"+"  "+incomingNumber); 
break;
case TelephonyManager.CALL_STATE_RINGING:
 
//设置静音
am.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
  

//正当模式 mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
Toast.makeText(getApplicationContext(), "来电已经拦截", Toast.LENGTH_SHORT).show();
Log.i("CALL_STATE_RINGING", "振铃"+"  "+incomingNumber);
 
break; 
}

}
}

 

 
}

抱歉!评论已关闭.