由于初学(菜)的原因,没有考虑到在6.0版本以上需要权限的问题,等到期末考试后会及时进行更新

初学安卓,代码结构略显混乱,有任何问题欢迎提出!

界面

布局

布局中主要有四个元素,分别为设置号码,清除号码,显示当前自动转发号码以及输入号码的文本框,设置号码实现了从EditText中提取号码,并更新TextView的功能,清除号码实现了清除EditText以及TextView中号码的功能

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><EditTextandroid:id="@+id/number"android:layout_height="wrap_content"android:layout_width="wrap_content"android:hint="Phone Number"android:textSize="30dp"android:inputType="phone"android:singleLine="true"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:text="当前设置自动转发号码:"android:textSize="10dp"/><TextViewandroid:id="@+id/cur_number"android:layout_height="wrap_content"android:layout_width="wrap_content"android:text="无"android:textSize="10dp"/></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/button1"android:layout_height="wrap_content"android:layout_width="wrap_content"android:text="设置号码"/><Buttonandroid:id="@+id/button2"android:layout_height="wrap_content"android:layout_width="wrap_content"android:text="清除号码"/></LinearLayout></LinearLayout>

主活动

在活动里通过两次回调,分别实现了获取从广播中接收到的短信内容以及接收后自动转发的功能
在这里注意一点,即当调用sendMultipartTextMessage时,对于信息String和PendingIntent都应该使用ArrayList进行传递,反之sendTextMessage亦然

 public class MainActivity extends AppCompatActivity implements Callback{List<String> content;TextView textView,textView2;EditText editText;Button button,button1,button2;String num,sum;ArrayList<String> text;ArrayList<PendingIntent> pi;SmsReceiver smsReceiver;IntentFilter intentFilter;SmsManager smsMgr;PendingIntent PiSingle;Intent intent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initActi();//        button.setOnClickListener(new View.OnClickListener() {//            @Override
//            public void onClick(View v) {//                smsReceiver.doWork(MainActivity.this);
//                if(text!=null&&num!=null) {//                    smsMgr.sendMultipartTextMessage(num, null, text, pi, null);
//                    Log.d(" Num:",num);
//                } else if(num==null){//                    Toast.makeText(MainActivity.this,"Please Input the Phone Number",Toast.LENGTH_LONG).show();
//                } else if(text==null){//                    Toast.makeText(MainActivity.this,"No message sent",Toast.LENGTH_LONG).show();
//                }
//            }
//        });button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(editText.getText()==null||editText.getText().toString()==""){Toast.makeText(MainActivity.this,"Please Input the Phone Number",Toast.LENGTH_LONG).show();}else{num=editText.getText().toString();if(num!=null||num=="") {textView2.setText(num);Log.d(" Num:", num);}}}});button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {num=null;text=null;editText.setText("");textView2.setText("无");Log.d(" Num:",""+(num==null));}});}public void initActi(){text=new ArrayList<>();pi=new ArrayList<>();textView=(TextView)findViewById(R.id.content);textView2=(TextView)findViewById(R.id.cur_number);//button=(Button)findViewById(R.id.button);button1=(Button)findViewById(R.id.button1);button2=(Button)findViewById(R.id.button2);editText=(EditText)findViewById(R.id.number);smsReceiver=new SmsReceiver(new Callback2() {@Overridepublic void doSomething() {smsReceiver.doWork(MainActivity.this);if(text!=null&&num!=null) {smsMgr.sendMultipartTextMessage(num, null, text, pi, null);Log.d(" Num:",num);} else if(num==null){Toast.makeText(MainActivity.this,"Please Input the Phone Number",Toast.LENGTH_LONG).show();} else if(text==null){Toast.makeText(MainActivity.this,"No message sent",Toast.LENGTH_LONG).show();}}});intentFilter=new IntentFilter();intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");registerReceiver(smsReceiver,intentFilter);smsMgr = SmsManager.getDefault();PiSingle = PendingIntent.getBroadcast(this, 0, this.getIntent(), 0);//intent=new Intent();}public void doEvent(ArrayList res1,String res2){text=res1;//num=res2;pi=new ArrayList<>();sum="";if(text!=null) {for(String str:text){pi.add(PiSingle);sum+=str;}}}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(smsReceiver);}
}

两个回调接口

该接口实现了从broadcaster中获取文本信息,并使用ArrayList分割回传

public interface Callback {void doEvent(ArrayList res1, String res2);
}

该接口实现了当broadcaster接收到广播信息时,立即将消息回调至主活动,并进行发送消息的操作

public interface Callback2 {void doSomething();
}

广播

广播中的获取消息部分借鉴了其他大佬的思路。在类中定义了一个回调接口,并实现了当执行onReceive时,立刻返回至onCreate执行接下来的操作。

public class SmsReceiver extends BroadcastReceiver {String num;ArrayList<String> text;Callback2 callback;public SmsReceiver(Callback2 callback2){this.callback=callback2;}@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();if (bundle!=null){Object pdusData[] = (Object[]) bundle.get("pdus");// pdus :protocol data unitSmsMessage[] msg = new SmsMessage[pdusData.length];for (int i = 0;i < msg.length;i++){byte pdus[] = (byte[]) pdusData[i];msg[i] = SmsMessage.createFromPdu(pdus);}StringBuffer phoneNumber = new StringBuffer();//获取地址text=new ArrayList<>();for (SmsMessage temp : msg){text.add(temp.getMessageBody());num=temp.getOriginatingAddress();}}callback.doSomething();}public void doWork(Callback callback){callback.doEvent(text,num);}
}

Android 利用广播实现短信的自动转发相关推荐

  1. Android 之 拦截手机短信并自动转发

    [size=medium][color=red][b]拦截短信和发送短信都需要相关的权限:[/b][/color][/size] <?xml version="1.0" en ...

  2. Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接

    Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...

  3. android 短信验证码自动填写的两种方式

    https://blog.csdn.net/u010399316/article/details/48781319 https://www.01hai.com/note/av123438 https: ...

  4. android 发送短信 广播 demo,向Android模拟器打电话发短信的简单方法

    在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这 ...

  5. android 短信验证码自动填写的二种方法

    转载自:https://blog.csdn.net/VirusDerekRuler/article/details/78506522 现在开发越来越注重用户体验了,现今Android基本都有短信验证功 ...

  6. Android 短信验证码自动填写

    这个也不是什么新东西,目前很多app都有这个功能,最近有几个小伙伴问我是怎么实现的,索性写一篇博客来为大家解答. 实现思路很简单:1.在需要输入验证码的Activity代码注册监听短信的广播 2.拦截 ...

  7. android短信验证码代码,Android短信验证码自动填写实现代码

    今天给大家分享一个Android短信验证码自动填写的功能.先看下效果图,我发送了一条短信到手机,自动填写验证码.如图: 这个小功能运用到了观察者模式,什么是观察者模式? 观察者模式 :定义对象间的一种 ...

  8. Android短信验证码自动填写功能的实现

    本文出自:黄敏争的博客 前言: android应用经常会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,通常,用户收到短信需要最小化应用去查看短信再填入验证码,必然比较麻烦, ...

  9. android 自动读取短息,Android实现短信验证码自动拦截读取功能

    本文实例为大家分享了Android短信验证码自动拦截读取 的具体代码,供大家参考,具体内容如下 知识准备: 1.观察者模式的理解[文章稍后来到~~] 2.Android的Cursor使用[Androi ...

最新文章

  1. 吴恩达专访:我的人工智能科研之路
  2. linux网络配置总结,linux中的网络配置命令的总结
  3. 12个常用的JavaScript技巧
  4. GridView多行表头合并
  5. mysql数据库突然连不上了_mysql数据库突然连接不上去
  6. Java 解析URL
  7. 手把手教你写ORM(七)
  8. spring mvc实现ajax 分页
  9. 【Flash】关于Flash停止支持相关问题总结
  10. 计算机总自动开机 如何关闭,手把手教你win10电脑关机后自动开机怎么解决
  11. 为什么OpenCV4 “pkg-config --modversion opencv”显示“ No package ‘opencv‘ found”?解决方法!
  12. 网站建设视频教程,史上最精,最全。
  13. 华中科技大学计算机科学与技术排名,2017华中科技大学专业排名
  14. 什么级别的企业可以进行数字化转型?
  15. linux c语言 cmos,c语言编写程序读写CMOS内容
  16. Centos 6安装Maven
  17. Tailwind教程1 - 开始使用
  18. 苹果MacBook电脑怎么捕捉特定窗口并截屏?
  19. Adobe Acrobat X Pro安装 pdf
  20. C++-算法(80)-单链表与双链表的反转(逆序)

热门文章

  1. 计算机基础教案免费,计算机基础教案(20190417033410)
  2. C++手敲灰度图均值滤波中值滤波高斯滤波
  3. java+springboot影楼婚纱照预约系统ssm
  4. MRT(MODIS Reprojection Tool) 工具下载及安装教程
  5. Android 手机信号强度上报机制1
  6. 首届“兴智杯”产业赛收官,文心大模型助推产业创新
  7. dig 命令 LINUX
  8. JavaScript | 正则表达式
  9. 国外的windows7优化大师
  10. 告别盗版杀软!免费用17款鼎鼎大名的杀毒软件