有时候可能是网络原因,导致收到多条重复的短信,还有一些备份软件,造成了多条重复的软件,今天花了点时间,简单写了一个短信去重的小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 Listinfos; 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 Listinfos; 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(ListsmsInfos) { 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)
站点信息
- 文章2300
- 用户1336
- 访客10858220
每日一句
Challenges spark life; conquering them gives purpose.
挑战点亮生活,征服赋予意义。
挑战点亮生活,征服赋予意义。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员