有时候可能是网络原因,导致收到多条重复的短信,还有一些备份软件,造成了多条重复的软件,今天花了点时间,简单写了一个短信去重的小APP。
数据库
源码下载: SmsTool
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
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2313
- 用户1336
- 访客11743126
每日一句
Change your thoughts and you change your world.
改变你的想法,你就改变了你的世界。
改变你的想法,你就改变了你的世界。
新会员