这里主要演示如何通过两个Activity间的数据传递和利用内容提供者向系统短信数据库插入短信来实现一个简单的短信发送器。
android短信发送器完整源码下载
我们直接看代码,注释已经写明
第一个界面的布局文件 --> 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" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/et_contact" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="14dp" android:hint="请输入联系人号码" android:inputType="text" > </EditText> <Button android:layout_alignBottom="@+id/et_contact" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:onClick="selectContacts" android:text="选择联系人" /> </RelativeLayout> <EditText android:id="@+id/et_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textMultiLine" android:minLines="10" > <requestFocus /> </EditText> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="send" android:text="发送" /> </LinearLayout>
第二个activity_contacts.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" > <ListView android:id="@+id/lv_contacts" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" > </ListView> </LinearLayout>
这是个ListView,所以我们在定义一个item布局文件 --> contact_item.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" > <TextView android:layout_marginTop="5dp" android:id="@+id/tv_name" android:layout_width="90dp" android:layout_height="wrap_content" android:text="姓名" android:textSize="25sp" /> <TextView android:layout_marginTop="5dp" android:id="@+id/tv_number" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="10" android:text="号码" android:textSize="25sp" /> </LinearLayout>
我们再来看看两个Activity
MainActivity.java
public class MainActivity extends Activity { private EditText et_contact; private EditText et_content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取组件 this.et_contact = (EditText) this.findViewById(R.id.et_contact); this.et_content = (EditText) this.findViewById(R.id.et_content); } /* * 选择联系人按钮绑定的事件 */ public void selectContacts(View view) { Intent intent = new Intent(this, ContactActivity.class); // 跳转到选择联系人界面,并将选择的联系人结果带回 this.startActivityForResult(intent, 0); } /* * 绑定发送按钮的点击事件 */ public void send(View view) { // 获取号码 String number = this.et_contact.getText().toString().trim(); // 获取内容 String content = this.et_content.getText().toString(); if (TextUtils.isEmpty(content)) { Toast.makeText(this, "内容不能为空!", 0).show(); return; } if (TextUtils.isEmpty(number)) { Toast.makeText(this, "号码不能为空!", 0).show(); return; } // 发送短信 sendSms(number, content); // 将短信插入数据库 insertSms(number, content); Toast.makeText(this, "短信已发送!", 0).show(); } /* * 插入短信 */ private void insertSms(String number, String content) { // ContentResolver接口可以访问ContentProvider提供的数据 ContentResolver resolver = this.getContentResolver(); // 解析短信数据库暴露出来的uri地址 Uri uri = Uri.parse("content://sms"); // 设置参数 ContentValues values = new ContentValues(); values.put("address", number); values.put("type", 2);// type=2表示是发送短信 values.put("date", System.currentTimeMillis()); values.put("body", content); resolver.insert(uri, values); } /* * 发送短信 */ private void sendSms(String number, String content) { // 获取短信管理类 SmsManager manager = SmsManager.getDefault(); // 切割短信内容 ArrayList<String> contents = manager.divideMessage(content); for (String str : contents) { // 发送短信 manager.sendTextMessage(number, null, str, null, null); } } /* * 接收上一个Activity传递过来的数据 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (data != null) { // 获取电话号码并设置给EditText String number = data.getStringExtra("number"); et_contact.setText(number); } } }
public class ContactActivity extends Activity { private ArrayList<HashMap<String, String>> smsInfos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contacts); // 获取ListView组件 ListView lv_contacts = (ListView) this.findViewById(R.id.lv_contacts); // 用于存放联系人信息 this.smsInfos = new ArrayList<HashMap<String, String>>(); // 查询所有联系人信息 this.getContacts(); // 将联系人信息添加的适配器中 lv_contacts.setAdapter(new SimpleAdapter(this, smsInfos, R.layout.contact_item, new String[] { "name", "number" }, new int[] { R.id.tv_name, R.id.tv_number })); // 为每个联系人注册点击事件 lv_contacts.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // 获取选中的联系人 HashMap<String, String> smsInfo = smsInfos.get(arg2); // 获取号码 String number = smsInfo.get("number"); // 将号码返回给上一个Activity Intent intent = new Intent(); intent.putExtra("number", number); setResult(0, intent); // 杀死当前Activity finish(); } }); } /* * 查询数据库,获取所有联系人号码 */ private void getContacts() { HashMap<String, String> smsInfo = null; ContentResolver resolver = this.getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); // 先查询出所有联系人的contact_id Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { String contact_id = cursor.getString(cursor .getColumnIndex("contact_id")); if (contact_id != null) { smsInfo = new HashMap<String, String>(); // 根据contact_id查询出该联系人每条详细信息 Cursor dataCursor = resolver.query(dataUri, new String[] { "data1", "mimetype" }, "raw_contact_id=?", new String[] { contact_id }, null); while (dataCursor.moveToNext()) { String data1 = dataCursor.getString(0); String mimetype = dataCursor.getString(1); // 判断当前条目是否为联系人的姓名 if ("vnd.android.cursor.item/name".equals(mimetype)) { smsInfo.put("name", data1); } // 判断当前条目是否为联系人的号码 if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) { smsInfo.put("number", data1); } } smsInfos.add(smsInfo); dataCursor.close(); } } cursor.close(); } }
package com.itheima.smssender.po; public class SmsInfo { private String name; private String number; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
由于访问联系人和读写短信内容都侵犯到用户的隐私,所以我们需要在清单文件中配置权限
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/>
<activity android:name=".ContactActivity" ></activity>