您的位置:首页 > 移动开发 > Android开发

Android_短信

2016-06-14 17:59 603 查看

Android_短信

1、接受短信

当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播携带者与短信相关的所有数据。结合我们从前学习的BroadcastReceiver相关的知识,我们就可以将这个小实践写出来。

1、activity_main.xml文件中的布局文件代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="10dp"
android:text="From"
/>
<TextView
android:id="@+id/sender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="10dp"
android:text="Content"
/>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
</LinearLayout>


2、在MainActivity中的主要逻辑代码:

public class MainActivity extends Activity {
private TextView tvSender,tvContent;
private IntentFilter filter;
private MessageReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
filter=new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
receiver=new MessageReceiver();
registerReceiver(receiver, filter);
tvSender=(TextView) findViewById(R.id.sender);
tvContent=(TextView) findViewById(R.id.content);
}
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();
}
tvSender.setText(address);
tvContent.setText(fullMessage);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}


3、不要忘了读取短信是需要权限的,我们要在AndroidManifest.xml文件中添加以下代码:

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


拦截短信

当我们在我们自己的程序中接收到短信的时候,我们手机屏幕上的状态栏中还会有系统给的通知,这样给用户的体验会非常的查,我们不想把这个短信发给系统,所以我们要拦截短信。系统发出的短信广播是一条有序广播。

1、在动态注册广播的同时,添加一行代码:

filter.setPriority(100);


2、在重写的onReceiver()方法中,当我们把我们的逻辑执行完以后,我们添加一行代码:

abortBroadcast();


这样,我们就可以防止系统的短信应用程序,接收到短信了。

发送短信

我还是在刚刚那个项目之上进行修改,我在activity_main.xml文件中又添加了2行布局。

1、

<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="10dp"
android:text="To:"
/>
<EditText
android:id="@+id/to"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<EditText
android:id="@+id/msg_input"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
/>
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Send"
/>
</LinearLayout>


2、我的MainActivity中的逻辑代码如下:

public class MainActivity extends Activity implements OnClickListener{
private TextView tvSender,tvContent;
private IntentFilter filter,sendFilter;
private MessageReceiver receiver;
private SendStatusReceiver sendReceiver;
private EditText etTo,etMsg;
private Button btnSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册接收短信的广播
filter=new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(100);
receiver=new MessageReceiver();
registerReceiver(receiver, filter);
//动态注册发送短信的广播
sendFilter=new IntentFilter();
sendFilter.addAction("SENT_SMS_ACTION");
sendReceiver =new SendStatusReceiver();
registerReceiver(sendReceiver, sendFilter);
//各个控件的实例化
tvSender=(TextView) findViewById(R.id.sender);
tvContent=(TextView) findViewById(R.id.content);
etTo=(EditText) findViewById(R.id.to);
etMsg=(EditText) findViewById(R.id.msg_input);
btnSend=(Button) findViewById(R.id.send);
btnSend.setOnClickListener(this);
}
//发送短信按钮的点击事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send:
SmsManager manager =SmsManager.getDefault();
//这里使用PendingIntent的目的就是为了验证短信发送成功了。
Intent sendIntent=new Intent("SENT_SMS_ACTION");
PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this, 0, sendIntent, 0);
manager.sendTextMessage(etTo.getText().toString(), null, etMsg.getText().toString(), pendingIntent, null);
break;

default:
break;
}
}
/**
* 接收短信的内部类
*
*/
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();
}
tvSender.setText(address);
tvContent.setText(fullMessage);
abortBroadcast();
}
}
/**
* 发送短信的内部类
*
*/
class SendStatusReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context arg0, Intent arg1) {
if (getResultCode()==RESULT_OK) {
Toast.makeText(MainActivity.this, "Send succeeded", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "Send failed", Toast.LENGTH_SHORT).show();
}
}

}
@Override
protected void onDestroy() {
super.onDestroy();
//注销接收短信的receiver
unregisterReceiver(receiver);
//注销发送短信的receiver
unregisterReceiver(sendReceiver);
}
}


3、最后,别让了发送短信也是需要权限的:

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


这里我们通过SmsManager的getDefault()方法获取到SmsManager的实例,然后调用sendTextMessage()方法发送短信。根据国际标准,每条短信的长度不得超过160个字符,如果想要发送超出这个长度的短信,则需要将这条短信分割成多条短信来发送。使用SmsManager的sendMultipartTextMessage()方法就可以实现上述的功能。

ArrayList<String> messages=manager.divideMessage(etMsg.getText().toString());
manager.sendMultipartTextMessage(etTo.getText().toString(), null, messages, null, null);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: