入门学习9:打电话 收发短信 BroadcastReceiver 收短信

本文主要介绍打电话  发短信  收短信 的基本方法。以及BroadcastReceiver的用法。

 

以下功能需要添加如下权限:

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


 

一、打电话功能比较简单:

        Button bt1 = (Button) findViewById(R.id.Button01);  
        bt1.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));  
                startActivity(intent);  
            }  
        });  

二、短信相关

 1、静态的BroadcastReceiver 。编写一个收短信的BroadcastReciever。

第一步,写activity主界面。

不做任何事情,就是把activity保存下来。写了个回调 设置标题,以看效果。

public class Levy_test1Activity extends MasterActivity {
	private static Levy_test1Activity ac01 = null;
	
	public static Levy_test1Activity getapp(){
		return ac01;
	}
	
	public void call_back(){
		setTitle("received");
	}

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
		ac01 = this;
        SetContentView(R.layout.main);
    }
}

第二步,实现一个recevier.

静态的BroadcastReceiver要求写一个继承此类的类:最简单的情况,收到短信就改下title

package com.alibaba.levy_test1;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class myreceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context arg0, Intent arg1) {
		// TODO Auto-generated method stub
		Levy_test1Activity app = Levy_test1Activity.getapp();
		app.call_back();	
	}

}


第三步,在manifast文件中注册权限和recevier


 

         <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".Levy_test1Activity" 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 android:name="myreceiver">
			<intent-filter>
				 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>

 

2、动态的方法,效果同上。

直接在程序中建立receiver

private BroadcastReceiver myReceiver = new BroadcastReceiver() {  
    public void onReceive(Context context, Intent intent) {  
        String action = intent.getAction();  
        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {  
              Levy_test1Activity app = Levy_test1Activity.getapp();app.call_back(); 
        }  
    }
};  

 

然后注册:

registerReceiver(myReceiver,new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));


以上是以系统短信为例,当然自己可以定义action,发送和接收消息处理。

 

3、发送短信和接收短信的相关函数:

SmsManager是用于短信处理的类,下文举例说明使用说法。

private void sendSMS(String phoneNumber, String message) {
	// ---sends an SMS message to another device---
	SmsManager sms = SmsManager.getDefault();
	if (message.length() > 70) {
		ArrayList<String> msgs = sms.divideMessage(message);
		for (String msg : msgs) {
			sms.sendTextMessage(phoneNumber, null, msg, null, null);
		}
	} else {
		sms.sendTextMessage(phoneNumber, null, message, null, null);
	}
	Toast.makeText(TextMessage.this, "短信发送完成", Toast.LENGTH_LONG).show();
}

上面sendTextMessage第4、5参数为空。如果需要处理短信发送后续状态的话,需要设置第4个参数,如果还需要发送送达对方手机的状态,还需要第5个参数。

这两个参数的类型是PendingIntent,表明满足条件时会执行intent广播。

以下是修改后的发送短信示例:

private void sendSMS(String phoneNumber, String message) {
	SmsManager sms = SmsManager.getDefault();
	String SENT_SMS_ACTION = "SENT_SMS_ACTION";
	String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";

	PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT_SMS_ACTION),0);
	PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,new Intent(DELIVERED_SMS_ACTION), 0);

	if (message.length() > 70) {
		ArrayList<String> msgs = sms.divideMessage(message);
		for (String msg : msgs) {
			sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);
		}
	} else {
		sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
	}
}

你可以采用前两节说的静态的方法建立相应action的BroadcastReceiver,也可以用代码注册,以下是一个例子:

	registerReceiver(new BroadcastReceiver() {
		@Override
		public void onReceive(Context _context, Intent _intent) {
			switch (getResultCode()) {
			case Activity.RESULT_OK:
				Toast.makeText(getBaseContext(),
						"SMS sent success actions", Toast.LENGTH_SHORT)
						.show();
				break;
			case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
				Toast.makeText(getBaseContext(),
						"SMS generic failure actions", Toast.LENGTH_SHORT)
						.show();
				break;
			case SmsManager.RESULT_ERROR_RADIO_OFF:
				Toast
						.makeText(getBaseContext(),
								"SMS radio off failure actions",
								Toast.LENGTH_SHORT).show();
				break;
			case SmsManager.RESULT_ERROR_NULL_PDU:
				Toast.makeText(getBaseContext(),
						"SMS null PDU failure actions", Toast.LENGTH_SHORT)
						.show();
				break;
			}
		}
	}, new IntentFilter(SENT_SMS_ACTION));
	registerReceiver(new BroadcastReceiver() {
		@Override
		public void onReceive(Context _context, Intent _intent) {
			Toast.makeText(getBaseContext(), "SMS delivered actions",
					Toast.LENGTH_SHORT).show();
		}
	}, new IntentFilter(DELIVERED_SMS_ACTION));




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值