android短信去重源码

Home / Android MrLee 2014-8-17 3068

有时候可能是网络原因,导致收到多条重复的短信,还有一些备份软件,造成了多条重复的软件,今天花了点时间,简单写了一个短信去重的小APP。

package com.lee.smstool;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@SuppressLint("HandlerLeak")
public class MainActivity extends Activity {
	private ListView listview;
	private List infos;
	private TextView toatal;
	private TextView toatal_backup;
	/**
	 * 所有的短信
	 */
	public static final String SMS_URI_ALL = "content://sms/";
	/**
	 * 收件箱短信
	 */
	public static final String SMS_URI_INBOX = "content://sms/inbox";
	/**
	 * 发件箱短信
	 */
	public static final String SMS_URI_SEND = "content://sms/sent";
	/**
	 * 草稿箱短信
	 */
	public static final String SMS_URI_DRAFT = "content://sms/draft";
	private SmsContent sc;
	private SmsListAdapter adapter;
	private SQLiteUtil util;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.sms);
		toatal = (TextView) findViewById(R.id.toatal);
		toatal_backup = (TextView) findViewById(R.id.toatal_backup);
		toatal.setText(String.valueOf(0));
		Uri uri = Uri.parse(SMS_URI_ALL);
		sc = new SmsContent(this, uri);
		util = new SQLiteUtil(this);
		infos = new ArrayList();
		listview = (ListView) this.findViewById(R.id.ListView_Sms);
		adapter = new SmsListAdapter(this);
		listview.setAdapter(adapter);
		toatal_backup.setText(String.valueOf(util.getInfos().size()));
	}
	public void add(List list, SmsInfo info) {
		boolean b = false;
		for (int i = 0; i < list.size(); i++) {
			SmsInfo smsInfo = list.get(i);
			if (smsInfo.getSmsbody() != null
					&& smsInfo.getSmsbody().equals(info.getSmsbody())) {
				b = true;
				System.out.println("要删除的ID:" + smsInfo.getThreadId());
				break;
			}
		}
		if (!b)
			list.add(info);
	}
	/**
	 * 删除一条短信里面的一个会话
	 *
	 * @param pid
	 */
	public void delete(int pid) {
		Uri uriSms = Uri.parse(SMS_URI_ALL);
		Cursor c = getContentResolver().query(uriSms, null, null, null, null);
		// Delete the SMS
		while (c.moveToNext()) {
			int id = c.getInt(c.getColumnIndex("_id"));
			if (id == pid)
				getContentResolver().delete(Uri.parse("content://sms"),
						"_id=" + id, null);
		}
	}
	/**
	 * 删除某人的短信,包含里面所有的会话
	 *
	 * @param tid
	 */
	public void deleteSMS(long tid) {
		Uri uriSms = Uri.parse(SMS_URI_ALL);
		Cursor c = getContentResolver().query(uriSms, null, null, null, null);
		// Delete the SMS
		if (null != c && c.moveToFirst()) {
			do {
				// Delete SMS
				long threadId = c.getLong(1);
				if (threadId == tid) {
					getContentResolver()
							.delete(Uri.parse("content://sms/conversations/"
									+ threadId), null, null);
					break;
				}
			} while (c.moveToNext());
		}
	}
	public void insert(SmsInfo info) {
		ContentValues values = new ContentValues();
		// 发送时间
		if (info.getDate() != null)
			values.put("date", Long.parseLong(info.getDate()));
		// 阅读状态
		values.put("read", 1);
		// 1为收 2为发
		values.put("type", info.getType());
		// 送达号码
		values.put("address", info.getPhoneNumber());
		// 送达内容
		values.put("body", info.getSmsbody());
		// ...还有一些其他参数可填
		// 插入短信库
		getContentResolver().insert(Uri.parse("content://sms"), values);
	}
	public ProgressDialog dialog;
	public Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			dialog.setProgress(msg.what);
			if (msg.what >= msg.arg1) {
				dialog.dismiss();
				Toast.makeText(MainActivity.this, "还原成功!", Toast.LENGTH_LONG)
						.show();
			}
		}
	};
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.read:
			infos.addAll(sc.getSmsInfo());
			toatal.setText(String.valueOf(infos.size()));
			break;
		case R.id.merge:
			List list = new ArrayList();
			for (int i = 0; i < infos.size(); i++)
				add(list, infos.get(i));
			infos = list;
			toatal.setText(String.valueOf(infos.size()));
			adapter.notifyDataSetChanged();
			break;
		case R.id.write: {
			if (infos.size() > 0)
				deleteSMS(infos.get(0).getThreadId());
			final List infos = util.getInfos();
			dialog = new ProgressDialog(this);
			dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置水平进度条
			dialog.setTitle("当前进度");
			dialog.show();
			new Thread() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					super.run();
					int nCount = 0;
					int toatal = infos.size();
					dialog.setMax(toatal);
					dialog.setProgress(0);
					for (int i = infos.size() - 1; i >= 0; i--) {
						SmsInfo smsInfo = infos.get(i);
						nCount++;
						insert(smsInfo);
						Message msg = new Message();
						msg.what = nCount;
						msg.arg1 = toatal;
						handler.sendMessage(msg);
					}
				}
			}.start();
		}
			break;
		case R.id.backup:
			util.dropTable();
			util.add(infos);
			toatal_backup.setText(String.valueOf(util.getInfos().size()));
			break;
		}
		adapter.notifyDataSetChanged();
	}
	@Override
	public void finish() {
		// TODO Auto-generated method stub
		super.finish();
		System.exit(0);
	}
	class SmsListAdapter extends BaseAdapter {
		private LayoutInflater layoutinflater;
		public SmsListAdapter(Context c) {
			layoutinflater = LayoutInflater.from(c);
		}
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return infos.size();
		}
		@Override
		public SmsInfo getItem(int position) {
			// TODO Auto-generated method stub
			return infos.get(position);
		}
		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				convertView = layoutinflater.inflate(R.layout.smsitem, null);
				holder = new ViewHolder();
				holder.nameView = (TextView) convertView
						.findViewById(R.id.TextView_SmsName);
				holder.bodyView = (TextView) convertView
						.findViewById(R.id.TextView_SmsBody);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			if (getItem(position).getType().equals("1")) {
				holder.nameView.setGravity(Gravity.LEFT);
				holder.bodyView.setGravity(Gravity.LEFT);
			} else {
				holder.nameView.setGravity(Gravity.RIGHT);
				holder.bodyView.setGravity(Gravity.RIGHT);
			}
			holder.nameView.setText(getItem(position).getPhoneNumber());
			holder.bodyView.setText(getItem(position).getSmsbody());
			return convertView;
		}
		class ViewHolder {
			TextView nameView;
			TextView bodyView;
		}
	}
}

package com.lee.smstool;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build.VERSION;
public class SmsContent {
	private Activity activity;
	private Uri uri;
	private List infos;
	public SmsContent(Activity activity, Uri uri) {
		infos = new ArrayList();
		this.activity = activity;
		this.uri = uri;
	}
	public List getSmsInfo() {
		long begin = System.currentTimeMillis();
		String[] projection = new String[] { "_id", "address", "person",
				"body", "date", "type", "thread_id" };
		Cursor cusor = activity.managedQuery(uri, projection, null, null,
				"date desc");
		int idColumn = cusor.getColumnIndex("_id");
		int tidColumn = cusor.getColumnIndex("thread_id");
		int nameColumn = cusor.getColumnIndex("person");
		int phoneNumberColumn = cusor.getColumnIndex("address");
		int smsbodyColumn = cusor.getColumnIndex("body");
		int dateColumn = cusor.getColumnIndex("date");
		int typeColumn = cusor.getColumnIndex("type");
		if (cusor != null) {
			while (cusor.moveToNext()) {
				SmsInfo smsinfo = new SmsInfo();
				smsinfo.setId(cusor.getInt(idColumn));
				smsinfo.setThreadId(cusor.getLong(tidColumn));
				smsinfo.setName(cusor.getString(nameColumn));
				smsinfo.setDate(cusor.getString(dateColumn));
				smsinfo.setPhoneNumber(cusor.getString(phoneNumberColumn));
				smsinfo.setSmsbody(cusor.getString(smsbodyColumn));
				smsinfo.setType(cusor.getString(typeColumn));
				infos.add(smsinfo);
			}
			if (VERSION.SDK_INT < 14)
				cusor.close();
		}
		long use = System.currentTimeMillis() - begin;
		System.out.println(">>>" + use + "/ms");
		return infos;
	}
}

package com.lee.smstool;
public class SmsInfo {
	private int id;
	/**
	 * 短信内容
	 */
	private String smsbody;
	/**
	 * 发送短信的电话号码
	 */
	private String phoneNumber;
	/**
	 * 发送短信的日期和时间
	 */
	private String date;
	/**
	 * 发送短信人的姓名
	 */
	private String name;
	/**
	 * 短信类型1是接收到的,2是已发出
	 */
	private String type;
	private long threadId;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getSmsbody() {
		return smsbody;
	}
	public void setSmsbody(String smsbody) {
		this.smsbody = smsbody;
	}
	public String getPhoneNumber() {
		return phoneNumber;
	}
	public void setPhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public long getThreadId() {
		return threadId;
	}
	public void setThreadId(long threadId) {
		this.threadId = threadId;
	}
}

数据库
package com.lee.smstool;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class SQliteHelper extends SQLiteOpenHelper {
	private static final String name = "sms_info.db";
	public SQliteHelper(Context context) {
		super(context, SQliteHelper.name, null, 1);
		// TODO Auto-generated constructor stub
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		// db.execSQL("DROP TABLE IF EXISTS person");
		db.execSQL("CREATE TABLE IF NOT EXISTS person"
				+ "(_id INTEGER PRIMARY KEY AUTOINCREMENT, sms_number VARCHAR, sms_body  TEXT,sms_type VARCHAR,sms_date VARCHAR)");
	}
	// 如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("ALTER TABLE person ADD COLUMN other STRING");
	}
}

package com.lee.smstool;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build.VERSION;
import android.widget.Toast;
public class SQLiteUtil {
	private SQliteHelper helper;
	private SQLiteDatabase db;
	private Context context;
	public SQLiteUtil(Context context) {
		this.context = context;
		helper = new SQliteHelper(context);
		db = helper.getWritableDatabase();
	}
	/**
	 * add persons
	 *
	 * @param persons
	 */
	public void add(List smsInfos) {
		db.beginTransaction(); // 开始事务
		long begin = System.currentTimeMillis();
		try {
			int nCount = 0;
			for (SmsInfo smsInfo : smsInfos) {
				db.execSQL(
						"INSERT INTO person(sms_number,sms_body,sms_type,sms_date) VALUES(?, ?, ?, ?)",
						new Object[] { smsInfo.getPhoneNumber(),
								smsInfo.getSmsbody(), smsInfo.getType() ,smsInfo.getDate()});
				nCount++;
				if (nCount % 1000 == 0)
					Toast.makeText(context, "剩余:" + (smsInfos.size() - nCount),
							Toast.LENGTH_SHORT).show();
			}
			db.setTransactionSuccessful(); // 设置事务成功完成
		} finally {
			db.endTransaction(); // 结束事务
		}
		long use = System.currentTimeMillis() - begin;
		Toast.makeText(context, "备份完成,花费:" + use + "ms", Toast.LENGTH_LONG)
				.show();
	}
	public List getInfos() {
		List infos = new ArrayList();
		Cursor c = db.rawQuery("SELECT * FROM person", null);
		if (c != null) {
			int phoneNumberColumn = c.getColumnIndex("sms_number");
			int smsbodyColumn = c.getColumnIndex("sms_body");
			int typeColumn = c.getColumnIndex("sms_type");
			int dateColumn = c.getColumnIndex("sms_date");
			if (!c.moveToFirst())
				return infos;// 没有数据
			do {
				SmsInfo info = new SmsInfo();
				info.setPhoneNumber(c.getString(phoneNumberColumn));
				info.setSmsbody(c.getString(smsbodyColumn));
				info.setType(c.getString(typeColumn));
				info.setDate(c.getString(dateColumn));
				infos.add(info);
			} while (c.moveToNext());
		}
		if (VERSION.SDK_INT < 14)
			c.close();
		return infos;
	}
	public void dropTable() {
		db.execSQL("DROP TABLE IF EXISTS person");
		db.execSQL("CREATE TABLE IF NOT EXISTS person"
				+ "(_id INTEGER PRIMARY KEY AUTOINCREMENT, sms_number VARCHAR, sms_body  TEXT,sms_type VARCHAR,sms_date VARCHAR)");
	}
}

源码下载: SmsTool

本文链接:https://www.it72.com/166.htm

推荐阅读
最新回复 (0)
返回