精华内容
下载资源
问答
  • android短信接收过程

    2012-11-01 09:59:29
    短信来了之后framework会发送广播 “android.provider.Telephony.SMS_RECEIVED”  ---------------------------------------PrivilegedSmsReceiver---------------------  此时,PrivilegedSmsReceiver会接受到...

     短信来了之后framework会发送广播 “android.provider.Telephony.SMS_RECEIVED”
       ---------------------------------------PrivilegedSmsReceiver---------------------
      此时,PrivilegedSmsReceiver会接受到该广播,调用父类SmsReceiver的 onReceiveWithPrivilege()方法
      此方法内获取一个wake lock 然后启动SmsReceiverService服务


      ---------------------------------------SmsReceiverService------------------------
      启动该服务后,会调用onStartCommand方法,该方法以之前传来的Intent为Message的Obj发送一条Message
      在handleMessage方法里面通过Intent判断后执行相应的操作,如 handleSmsSent,handleSmsReceived,
      handleBootCompleted,handleServiceStateChanged
      接受到短信时当然执行handleSmsReceived方法
      该方法内通过Intents.getMessagesFromIntent(intent)方法从Intent里面取出Message[]
      然后通过insertMessage(this, msgs)方法插入短信insertMessage里通过调用storeMessage方法
      storeMessage方法执行values.put(Inbox.BODY, sms.getDisplayMessageBody())方法就可以将
      短信以ContentValues的形式插入数据库。
      insertMessage方法如果插入成功将会返回插入短信的Uri,如果此Uri不为Null,说明已经插入数据库,于是
      执行MessagingNotification.updateNewMessageIndicator(this, true);
      该方法则会根据短信的状态,发出提示音或震动,也可以根据设置notification
      自此,一条新信息就成功接受了。
      短信的所有提示都是通过Notification来提示的,所以当从设置里面把Notification的震动关闭,设为静音的话,
      无所短信设置里面怎么设置提示方式都没用。因为短信提示就是一个普通的Notification

    展开全文
  • sms短信息接收过程

    2012-10-31 18:21:59
    启动该服务后,会调用onStartCommand方法,该方法以之前传来的Intent为Message的Obj发送一条Message。 在handleMessage方法里面通过Intent判断后执行相应的操作,如handleSmsSent,...接受到短信时当然执行h

    启动该服务后,会调用onStartCommand方法,该方法以之前传来的Intent为Message的Obj发送一条Message。

    在handleMessage方法里面通过Intent判断后执行相应的操作,如handleSmsSent,handleSmsReceived,handleBootCompleted,handleServiceStateChanged

    接受到短信时当然执行handleSmsReceived方法,该方法内通过Intents.getMessagesFromIntent(intent)方法从Intent里面取出Message[]

    然后通过insertMessage(this, msgs)方法插入短信insertMessage里通过调用storeMessage方法。

    storeMessage方法执行values.put(Inbox.BODY, sms.getDisplayMessageBody())方法就可以将短信以ContentValues的形式插入数据库。

    insertMessage方法如果插入成功将会返回插入短信的Uri,如果此Uri不为Null,说明已经插入数据库,于是执行MessagingNotification.updateNewMessageIndicator(this, true);

    该方法则会根据短信的状态,发出提示音或震动,也可以根据设置notification,

    自此,一条新信息就成功接受了。

    短信的所有提示都是通过Notification来提示的,所以当从设置里面把Notification的震动关闭,设为静音的话,无所短信设置里面怎么设置提示方式都没用。

    因为短信提示就是一个普通的Notification

    展开全文
  • 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收短信。首先需要添加短信功能的权限 <uses-permission android:
    
        ad1.jpg
    

    全栈工程师开发手册 (作者:栾鹏)
    安卓教程全解

    安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

    首先需要添加短信功能的权限

    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    

    调用系统短信功能发送短信

    注意:由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,因此这里只会启动系统短信发送界面,还没有自动发送

    调用发送函数
    send_message("12345678911","这是代码发送的一条短信");
    
    短信发送函数
      private void send_message(String number,String message) {
      	//使用系统短信服务栈发送短信
        Intent smsintent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+number));
        smsintent.putExtra("sms_body",message);
        startActivity(smsintent);  //由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,因此这里只会启动系统短信发送界面,还没有自动发送
      }
    

    调用系统彩信功能发送媒体信息(彩信,邮件)

    调用发送函数
    send_mulmessage("12345678911","这是代码发送的一条彩信");
    
    彩信发送函数
     private void send_mulmessage(String number,String message) {
        //获得要附加的一个媒体的uri
        Uri attached_Uri=Uri.parse("content://media/external/images/media/1");
        //创建一个新的MMS intent
        Intent mmsIntent=new Intent(Intent.ACTION_SEND,attached_Uri);
        mmsIntent.putExtra("sms_body", message);
        mmsIntent.putExtra("address", number);
        mmsIntent.putExtra(Intent.EXTRA_STREAM, attached_Uri);
        mmsIntent.setType("image/jpeg");
        startActivity(mmsIntent);
      }
    

    使用SmsManager 发送sms短信信息

    使用SmsManager短信管理器发送短信,不会启动系统短信发送界面,但是由于短信在发送成功、失败、接收者接收成功、失败、是否已读等消息,安卓系统都会通过广播形式向系统所有app进行广播,所以仍然会在系统自带短信功能中留下痕迹。

    在使用SmsManager发送短信时,需要自定义短信发送广播接收事件、短信送达广播接收事件。另外要注意将短信按运营商的限制长度进行分割。

    由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,这种自动发送的短信,没法选择发送模式,所以会存在发送失败的情况

    调用发送函数
    sendsms("12345678911","这是代码发送的一条短信");
    
    短信发送函数
    private void sendsms(String number,String message) {
    	//获取短信管理器   
        android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); 
    
    	String sent_sms_action = "com.lp.app.send_sms_action";   //短信发送成功(只是一个名称)
    	String delivered_sms_action ="com.lp.app.delivered_sms_action";  //短信送达成功(只是一个名称)
      
    	//创建sentintent参数
    	Intent sentIntent = new Intent(sent_sms_action);
    	PendingIntent sendpi =PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    	  
    	//创建deliveryintent参数
    	Intent deliveryIntent=new Intent(delivered_sms_action);
    	PendingIntent deliverpi = PendingIntent.getBroadcast(getApplicationContext(), 0, deliveryIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    	
    	//注册broadcast receiver,用于在消息发生成功或者失败时触发
    	registerReceiver(new BroadcastReceiver(){
    		@Override
    		public void onReceive(Context context, Intent intent) {
    			String resulttext = "unknown";
    			switch (getResultCode()) {
    				case Activity.RESULT_OK:resulttext="发送成功";break;
    				case android.telephony.SmsManager.RESULT_ERROR_GENERIC_FAILURE:resulttext="发送失败";break;
    				case android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF:resulttext="发送失败,无线处于关闭状态";break;
    				case android.telephony.SmsManager.RESULT_ERROR_NULL_PDU:resulttext="发送失败,没有指定的PDU";break;
    				case android.telephony.SmsManager.RESULT_ERROR_NO_SERVICE:resulttext="发送失败,无服务";break;
    				default:break;
    			}
    			Log.v("发送的短信", resulttext);
    		}
    	}, new IntentFilter(sent_sms_action));  //用指定名称的事件来触发这个接收机
    	
    	//注册broadcast receiver,用于仅在接收人接收到sms消息后触发
    	registerReceiver(new BroadcastReceiver(){
    		@Override
    		public void onReceive(Context context, Intent intent) {
    			String resulttext = "unknown";
    			switch (getResultCode()) {
    				case android.telephony.SmsManager.STATUS_ON_ICC_FREE:resulttext="自由空间";break;
    				case android.telephony.SmsManager.STATUS_ON_ICC_READ:resulttext="接收且已读";break;
    				case android.telephony.SmsManager.STATUS_ON_ICC_SENT:resulttext="存储且已发送";break;
    				case android.telephony.SmsManager.STATUS_ON_ICC_UNREAD:resulttext="接收但未读";break;
    				case android.telephony.SmsManager.STATUS_ON_ICC_UNSENT:resulttext="存储但未发送";break;
    				default:break;
    			}
    			Log.v("发送的短信", resulttext);
    		}
    		
    	},  new IntentFilter(delivered_sms_action)); //用指定名称的事件来触发这个接收机
    	  
    
    	//拆分短信内容(手机短信长度限制)    
        List<String> divideContents = smsManager.divideMessage(message);   
        for (String text : divideContents) {    
        	//由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,这种自动发送的短信,没法选择发送模式,所以会存在发送失败的情况
            smsManager.sendTextMessage(number, null, text, sendpi, deliverpi);    //参数:接收人,所有用的SMS服务中心,消息内容,跟踪传输的intent,消息成功递送的intent
            //smsManager.sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent);  //发送byte[]
            //smsManager.sendMultipartTextMessage(destinationAddress, scAddress, parts, sentIntents, deliveryIntents);  //发送多部分字符串内容
        }  
    

    广播监听接收到的短信

    在系统接收到短信后,系统会全局广播一个事件,事件中附加了短信的全部内容信息,我们可以通过注册广播接收来获取短信内容和相关信息。

    1、首先在manifest中注册一个广播接收

    <!-- 短信接收监视-->
    <receiver android:name="com.lp.app.advice.SMSReceiver" >
    	<intent-filter>
    	<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    	</intent-filter>
    </receiver>
    

    2、自定义广播接收器,解析接收到的短信

    import android.content.Intent;
    import android.os.Bundle;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.util.Log;
    
    //使用intent receiver监视接收的短信
    public class SMSReceiver extends BroadcastReceiver {
    	
    	  @Override
    	  public void onReceive(Context context, Intent intent) {
    		  Bundle bundle=intent.getExtras();
    		  if (bundle!=null) {
    			Object[] pdus = (Object[])bundle.get("pdus"); //pdus是一个object类型的数组,每一个object都是一个byte[]字节数组,每一项为一条短信。
    			android.telephony.SmsMessage[] messages = new android.telephony.SmsMessage[pdus.length];
    			for (int i = 0; i < pdus.length; i++) 
    				messages[i]=android.telephony.SmsMessage.createFromPdu((byte[])pdus[i]);
    			for(android.telephony.SmsMessage message: messages){
    				String msg = message.getMessageBody();   //获取消息内容
    				long when = message.getTimestampMillis();  //获取消息时间戳
    				String from =message.getOriginatingAddress();  //获取消息来源
    				Log.v("接收到的短息", "消息:"+msg);
    				Log.v("接收到的短息", "时间:"+when);
    				Log.v("接收到的短息", "发件人:"+from);
    			}
    		  }
    	  }
    }
    
    展开全文
  • 接收和发送短信

    2015-09-21 16:06:18
    当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据。每个应用程序都可以在广播接收器里对它进行监听,收到广播时再从中解析出...

    当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据。每个应用程序都可以在广播接收器里对它进行监听,收到广播时再从中解析出短信的内容即可。
    在MainActivity中新建MessageReceiver内部类继承自BroadcastReceiver,并在onReceive()方法中编写获取短信数据的逻辑,代码如下所示:

    public class MainActivity extends Activity {
    private TextView sender;
    private TextView content;
    private IntentFilter receiveFilter;
    private MessageReceiver messageReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sender = (TextView) findViewById(R.id.sender);
    content = (TextView) findViewById(R.id.content);
    receiveFilter = new IntentFilter();
    receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
    messageReceiver = new MessageReceiver();
    registerReceiver(messageReceiver, receiveFilter);
    }
    protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(messageReceiver);
    }
    class MessageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    Object[] pdus = (Object[]) bundle.get("pdus"); // 提取短信消息
    SmsMessage[] messages = new SmsMessage[pdus.length];
    for (int i = 0; i < messages.length; i++) {
    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
    }
    String address = messages[0].getOriginatingAddress(); // 获取发送方号码
    String fullMessage = "";
    for (SmsMessage message : messages) {
    fullMessage += message.getMessageBody(); // 获取短信内容
    }
    sender.setText(address);
    content.setText(fullMessage);
    }
    }
    }

    可以看到,首先我们从Intent参数中取出了一个Bundle对象,然后使用pdu密钥来提取一个SMS pdus数组,其中每一个pdu都表示一条短信消息。接着使用SmsMessage的createFromPdu()方法将每一个pdu字节数组转换为SmsMessage对象,调用这个对象的getOriginatingAddress()方法就可以获取到短信的发送方号码,调用getMessageBody()方法就可以获取到短信的内容,然后将每一个SmsMessage对象中的短信内容拼接起来,就组成了一条完整的短信。最后将获取到的发送方号码和短信内容显示在TextView

    代码到这里就已经完成得差不多了,不过最后我们还需要给程序声明一个接收短信的权限才行,修改AndroidManifest.xml中的代码,如下所示:

    <uses-permission android:name="android.permission.RECEIVE_SMS" />

    拦截短信

    系统发出的短信广播正是一条有序广播,因此我们可以拦截短信。

    public class MainActivity extends Activity {
    ……
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    ……
    receiveFilter = new IntentFilter();
    receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
    receiveFilter.setPriority(100);
    messageReceiver = new MessageReceiver();
    registerReceiver(messageReceiver, receiveFilter);
    }
    ……
    class MessageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    ……
    abortBroadcast();
    }
    }
    }

    可以看到,关键性的步骤只有两步。一是提高MessageReceiver的优先级,让它能够先于系统短信程序接收到短信广播。二是在onReceive()方法中调用abortBroadcast()方法,中止掉广播的继续传递。
    现在重新运行程序,再向模拟器发送一条短信,这时只有我们自己的程序才能收到这条短信了。按下Back键将程序关闭后,系统的短信程序又会重新拥有接收短信的功能。
    注意这个功能一定要慎用,随意拦截短信有可能会造成重要数据的丢失,所以你在拦截之前一定要先想清楚这种功能是不是你想要的。

    2.发送短信

    public class MainActivity extends Activity {
    ……
    private EditText to;
    private EditText msgInput;
    private Button send;
    private IntentFilter sendFilter;
    private SendStatusReceiver sendStatusReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    sendFilter = new IntentFilter();
    sendFilter.addAction("SENT_SMS_ACTION");
    sendStatusReceiver = new SendStatusReceiver();
    registerReceiver(sendStatusReceiver, sendFilter);
    
    to = (EditText) findViewById(R.id.to);
    msgInput = (EditText) findViewById(R.id.msg_input);
    send = (Button) findViewById(R.id.send);
    send.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    SmsManager smsManager = SmsManager.getDefault();
    Intent sentIntent = new Intent("SENT_SMS_ACTION");
    PendingIntent pi = PendingIntent.getBroadcast (MainActivity.this, 0, sentIntent, 0);
    smsManager.sendTextMessage(to.getText().toString(), null,
    msgInput.getText().toString(), pi, null);
    }
    });
    }
    protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(messageReceiver);
    unregisterReceiver(sendStatusReceiver);
    }
    
    class SendStatusReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    if (getResultCode() == RESULT_OK) {
    // 短信发送成功
    Toast.makeText(context, "Send succeeded", Toast.LENGTH_LONG).show();
    } else {
    // 短信发送失败
    Toast.makeText(context, "Send failed", Toast.LENGTH_LONG).show();
    }
    }
    }
    }

    在Send按钮的点击事件里面我们调用了PendingIntent的getBroadcast()方法获取到了一个PendingIntent对象,并将它作为第四个参数传递到sendTextMessage()方法中。然后又注册了一个新的广播接收器SendStatusReceiver,这个广播接收器就是专门用于监听短信发送状态的,当getResultCode()的值等于RESULT_OK就会提示发送成功,否则提示发送失败。
    发送短信的权限:

    <uses-permission android:name="android.permission. SEND_SMS" />
    展开全文
  • 创蓝253短信服务平台上总结了短信验证码接收不到的几个原因:(1)短信网关拥堵或出现异常 在一些节假日或者其他特殊时间段,由于短信的发送量在短时间内量大,造成短信网关拥堵或者其他反常状况,从而导致验证码...
  • 利用短信接收短信控制台程序

    千次阅读 2010-10-15 17:09:00
     /// GetMessage函数用于读取SIM卡中的短信  ///  /// 短信位置  public static string[] GetMessage(string comn,int wz,bool delyn)  {  //定义短信端口操作类  SerialPort serialPort = new SerialPort(...
  • android学习十四(android的接收短信

    千次阅读 2014-11-18 10:53:24
    android中短信的发送也接收拦截
  • 创蓝253短信服务平台上总结了短信验证码接收不到的几个原因:(1)短信网关拥堵或出现异常 在一些节假日或者其他特殊时间段,由于短信的发送量在短时间内量大,造成短信网关拥堵或者其他反常状况,从而导致验证码...
  • 通过广播接收者,接收短信,对短信内容进行判断,如果为我们指定的值就执行相应的操作。 如果短信内容是”#*location*#” 就执行,获取手机位置 如果短信内容是”#*alarm*#” 就执行,播放报警音乐 如果短信内容是...
  • 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这项功能,而Android作为出色的智能手机操作系统...你要知道,Android还提供了一系列的API,使得我们甚至可以在自己的应用程序里接收和发
  • 短信验证码接收不到原因分析

    千次阅读 2017-10-10 16:12:25
     以下是嘀哥总结的导致短信验证码不能接收或者长时间都收不到的五个原因,希望能帮到大家: (1)短信网关拥堵或出现异常  在一些特殊时间段,可能会出现短信网关拥堵或者其他反常状况,从而导致验证码...
  • Android-拦截接收短信

    2012-01-06 15:55:57
    // 通过pdus获得接收到的所有短信消息,获取短信内容; Object[] pdus = (Object[]) bundle.get("pdus"); // 构建短信对象数组; SmsMessage[] mges = new SmsMessage[pdus.length]; for (int i...
  • 联通SGIP发送接收短信

    2013-12-03 18:35:00
    目前,三大运营商都提供了自己的短信相关协议,比如联通的SGIP协议、移动的CMPP协议、电信的SMPP协议,发送和接收短信、彩信可以根据运营商提供的接口,编写相应的程序,以达到想要的功能。下面简单介绍一下工作中...
  • android广播监听接收和发送短信

    千次阅读 2016-12-01 17:29:30
    android广播监听接收和发送短信
  • android 接收短信流程

    千次阅读 2012-07-18 16:18:44
    短信来了之后framework会发送广播 “android.provider.Telephony.SMS_RECEIVED” ---------------------------------------PrivilegedSmsReceiver--------------------- 此时,PrivilegedSmsReceiver会接受到该...
  • 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这项功能,而Android 作为出色的...你要知道,Android 还提供了一系列的API,使得我们甚至可以在自己的应用程序里接收和发送短信。也就
  • 8.2 接收和发送短信   收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持。每个 Android 手机都会...
  • 进入后台,选择短信设置如下图   选择综合设置,把最下面那个按钮关掉即可,如下图所示    
  • 买了一个SIM900A 模块做开发。怎么通过AT命令关闭卡对短信接收和电话的接听?
  • 1. Tasker是什么 Tasker是Android的一个应用程序,它 根据用户定义的配置文件或可点击或计时器主屏幕小部件中的上下文(应用...爬虫遇到需要登录的时候如果出现需要输入手机短信验证码我们改怎么办?在某种环境中...
  • 亿佰云、秒嘀科技、极光短信和华信云通信这四家主流的短信验证码平台,在短信验证码收费方式方面,彼此各不相同,具体有按充值金额收费、按当月短信发送量收费、按购买短信条数收费等几种,而且基本上都是要求企业预...
  • 几秒钟后,Toast出消息,短信送达,对方已接收 同一时间,这边用于测试的手机收到短信   代码如下: MainActivity.java package com.example.smstest; import android.app.Activity; import android.app...
  • 短信来了之后framework会发送广播 “android.provider.Telephony.SMS_RECEIVED” ---------------------------------------PrivilegedSmsReceiver--------------------- 此时,PrivilegedSmsReceiver会接受到该...
  • 短信猫的发送与接收

    千次阅读 2008-10-26 14:54:00
    //关闭短信所有通道  return 1;  }else{  System.out.println("初始化错误!"+a);  return a;  }  } //短信接收  public static List getGSMSms(){  int a = 0;  List smsList = new ArrayList();...
  • 废话不多说,上代码先: 程序启动时调用的activity,在该activity中创建一个不绑定的service(防止程序退出后监控程序被关闭):package com.demo.broadcast; import ...
  • 设备类目前可以完成发送、接收、读取和删除短信,需要其他功能可以自行添加。谢谢支持,欢迎提出宝贵意见。 本程序使用用前两篇实现PDU编解码类,在此基础上完成短信的发送和读取PDU编解码参考:短信猫软件的实现...
  • 广播接收

    2020-04-18 21:30:12
    目的:接收短信播放歌曲 ... 在清单文件AndroidManifest.xml里,手工添加注册短信接收权限、配置短信广播接收意图过滤器的代码 布局文件 只用添加一个button来控制关闭 MainActivity中 Broadc...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,230
精华内容 9,692
关键字:

如何关闭所有短信接收