安卓短信发送器

这里主要演示如何通过两个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,部署程序就能跑起来了。




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值