之前的版本是在Android 1.6的API上面开发的。因为在Android 2.0以后,获取联系人信息的API有所改动,所以之前的方式已经不适用了。而且我之前使用的方法有误,并没能获取电话号码。具体的看代码吧,仅对获取联系人那个部分做了改动。
完整的项目源码已经上传到这里:微盘链接
- package com.myzhan;
- import java.util.ArrayList;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.provider.ContactsContract.PhoneLookup;
- import android.telephony.*;
- import android.view.View;
- import android.widget.*;
- public class AutoSMS extends Activity {
- private EditText SMSText = null;
- private Button startButton = null;
- private Button closeButton = null;
- private TextView instruction = null;
- private ArrayList<String> nameList = null;
- private ArrayList<String> numberList = null;
- private TelephonyManager telephonyManager = null;
- private SmsManager smsManager = null;
- private String incomingNumber = null;
- private boolean isMonitoring = false;
- public void serviceControl(boolean isMonitoring){
- if(!isMonitoring){
- startService();
- }else{
- stopService();
- }
- this.isMonitoring = !this.isMonitoring;
- }
- public void startService(){
- nameList = new ArrayList<String>();
- numberList = new ArrayList<String>();
- /*
- * 获取联系人信息,将联系人的名字存入nameList,将联系人的号码存入numberList
- */
- ContentResolver content = this.getContentResolver();
- Cursor cursor = content.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
- while(cursor.moveToNext()){
- //获取联系人的姓名
- nameList.add(cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)));
- //获取联系人的ID,并根据ID来获取电话号码
- //注意:一个联系人可以有多个电话号码,按照这种方式储存的话,nameList与numberList中的数据将失去联系
- String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
- Cursor phoneCursor = content.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="+ contactId, null, null);
- while(phoneCursor.moveToNext()){
- String number = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- numberList.add(number);
- }
- }
- /* 设置一个监听通话状态的Listener
- * 如果状态有改变,先判断自动回复服务有没有启动,再判断是不是有来电
- * 如果满足“服务启动”和“有来电”两个条件,即发送自动回复的信息
- * */
- PhoneStateListener phoneListener = new PhoneStateListener(){
- @Override
- public void onCallStateChanged(int state,String incoming){
- if(state == TelephonyManager.CALL_STATE_RINGING && isMonitoring){
- //这里的电话号码格式类似于“12345678910”
- //要将其格式化成“1-234-567-8910”这样的格式才能与numberList中的字符串匹配
- incomingNumber = PhoneNumberUtils.formatNumber(incoming);
- sendSMS();
- }
- }
- };
- telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
- telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
- smsManager = SmsManager.getDefault();
- instruction.setText("自动回复已经启动");
- }
- public void stopService(){
- /* 自动回复服务是否生效取决于isMonitoring的值
- * 不过这里可以做更多事情,例如将引用设置为null
- * */
- instruction.setText("自动回复已经停止");
- }
- public void sendSMS(){
- /* 简单来说,发送一条短信只需要
- * SmsManager smsManager = SmsManager.getDefault();
- * String smsText = "短信内容";
- * String number = "对方号码";
- * smsManager.sendTextMessage(incomingNumber, null, smsText, null, null);
- * */
- if(numberList.contains(incomingNumber)){
- String smsText = SMSText.getText().toString();
- smsManager.sendTextMessage(incomingNumber, null, smsText, null, null);
- instruction.setText("已经发送短信到" + incomingNumber);
- }
- }
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /* 这里就是和main.xml中的元素建立联系的时候啦!
- * */
- this.SMSText = (EditText)findViewById(R.id.SMSText);
- this.startButton = (Button)findViewById(R.id.startButton);
- this.closeButton = (Button)findViewById(R.id.closeButton);
- this.instruction = (TextView)findViewById(R.id.instruction);
- /* 监听startButton点击事件的listener
- * 根据isMonitoring的布尔值来决定启动或者关闭服务
- * */
- startButton.setOnClickListener(new Button.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- if(!isMonitoring){
- startButton.setText("停止自动回复");
- }else{
- startButton.setText("开始自动回复");
- }
- serviceControl(isMonitoring);
- }
- });
- /* 关闭按钮,退出程序
- * */
- closeButton.setOnClickListener(new Button.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- System.exit(0);
- }
- });
- }
- }