這裏主要演示如何通過兩個Activity間的數據傳遞和利用內容提供者向系統短信數據庫插入短信來實現一個簡單的短信發送器。
我們直接看代碼,註釋已經寫明
第一個界面的佈局文件 --> 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);
}
}
}
ContactActivity.java
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();
}
}
另外,我們再定義一個實體類來存放聯繫人信息 --> SmsInfo.java
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"/>
我們新建的ContactActivity要在清單文件中註冊
<activity
android:name=".ContactActivity"
></activity>
ok,部署程序就能跑起來了。