安卓短信發送器

這裏主要演示如何通過兩個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);
		}
	}

}

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,部署程序就能跑起來了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章