关于它的问题很多,我的申请中没有答案:(
我需要从接收器中删除SMS,即使用户可以看到它,但必须以编程方式删除它。
我该怎么做?
我使用的最合适的是以下内容,但它不起作用:(
context.getContentResolver().delete(
deleteUri,
"address=? and date=?",
new String[] { msg.getOriginatingAddress(),
String.valueOf(msg.getTimestampMillis()) });
答案 0 :(得分:9)
重构我的代码后,我发现下一个解决方案有效:
private int deleteMessage(Context context, SmsMessage msg) {
Uri deleteUri = Uri.parse("content://sms");
int count = 0;
Cursor c = context.getContentResolver().query(deleteUri, null, null,
null, null);
while (c.moveToNext()) {
try {
// Delete the SMS
String pid = c.getString(0); // Get id;
String uri = "content://sms/" + pid;
count = context.getContentResolver().delete(Uri.parse(uri),
null, null);
} catch (Exception e) {
}
}
return count;
}
谢谢大家的帮助!
ps如果此代码对某些代码有用 - 请记住catch(Exception)不好。
答案 1 :(得分:4)
只需在广播接收器中使用这个简单的代码即可。
try {
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = context.getContentResolver().query(
uriSms,
new String[] { "_id", "thread_id", "address", "person",
"date", "body" }, "read=0", null, null);
if (c != null && c.moveToFirst()) {
do {
long id = c.getLong(0);
long threadId = c.getLong(1);
String address = c.getString(2);
String body = c.getString(5);
String date = c.getString(3);
if (message.equals(body) && address.equals(number)) {
// mLogger.logInfo("Deleting SMS with id: " + threadId);
context.getContentResolver().delete(
Uri.parse("content://sms/" + id), "date=?",
new String[] { <your date>});
Log.e("log>>>", "Delete success.........");
}
} while (c.moveToNext());
}
} catch (Exception e) {
Log.e("log>>>", e.toString());
}
答案 2 :(得分:3)
deleteUri
的价值是什么?
您确定在尝试删除之前已将SMS写入本地存储吗?如果您正在处理SMS_RECEIVED
广播,则无法保证本地短信应用尚未处理短信...
此外,我会注意到Android内容提供商API未公开记录,并且可能会在将来发生变化。但是,如果你只针对Android 1.5(或当前的设备),那么你可能没问题。
答案 3 :(得分:2)
此链接可能有用
http://blog.chinaunix.net/u/9577/showart_1850111.html
我自己并没有完全实现它,但我实施的是
请注意,它没有完整记录,因此可能会在Android的未来版本中更改
编辑:
以下是我自己实现代码的方式:
String url = "content://sms/";
Uri uri = Uri.parse(url);
getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler));
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uriSms, null,null,null,null);
Log.d("COUNT", "Inbox count : " + c.getCount());
}
class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
super(handler);
}
@Override public boolean deliverSelfNotifications() {
return false;
}
@Override public void onChange(boolean arg0) {
super.onChange(arg0);
Log.v("SMS", "Notification on SMS observer");
Message msg = new Message();
msg.obj = "xxxxxxxxxx";
handler.sendMessage(msg);
Uri uriSMSURI = Uri.parse("content://sms/");
Cursor cur = getContentResolver().query(uriSMSURI, null, null,
null, null);
cur.moveToNext();
String protocol = cur.getString(cur.getColumnIndex("protocol"));
if(protocol == null){
Log.d("SMS", "SMS SEND");
int threadId = cur.getInt(cur.getColumnIndex("thread_id"));
Log.d("SMS", "SMS SEND ID = " + threadId);
getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null);
}
else{
Log.d("SMS", "SMS RECIEVE");
int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id"));
getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
}
}
}
代码侦听SMS内容提供程序中的更改。
如果您想删除短信,这是您感兴趣的行
getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
您必须删除整个会话以删除短信,我无法删除会话的最后一条消息
答案 4 :(得分:1)
使用此并成为快乐的家伙
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.SmsMessage;
import android.widget.Toast;
import android.net.Uri;
public class SmsReceiver extends BroadcastReceiver {
private Handler mHandler = new Handler();
private SmsMessage[] msgs;
private Context con;
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
msgs = null;
String str = "";
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++)
{
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += ":";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
con = context;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
deleteSMS();
}
}, 5000);
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
}
private void deleteSMS()
{
try
{
for (int i=0; i<msgs.length; i++)
{
con.getContentResolver().delete(Uri.parse("content://sms"), "address=? and date=?", new String[] {msgs[i].getOriginatingAddress(), String.valueOf(msgs[i].getTimestampMillis())});
}
}
catch (Exception ex)
{
Toast.makeText(con, "Error: " + ex, Toast.LENGTH_SHORT).show();
}
}
}