我想在我的Android应用程序中自动删除某些SMS.因此,我有一种方法可以完全按照我的意愿行事.但是,它仅在我将应用程序从Eclipse直接部署到我的手机时才有效.然后它删除传入的短信.但是,如果从市场下载应用程序,则无效.但也没有错误.有人知道我如何解决这个问题,或者这只能在root设备上运行吗?
public void deleteSMS(Context context, String message, String number) {
try {
mLogger.logInfo("Deleting SMS from inbox");
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = context.getContentResolver().query(uriSms,
new String[] { "_id", "thread_id", "address",
"person", "date", "body" }, null, 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);
if (message.equals(body) && address.equals(number)) {
mLogger.logInfo("Deleting SMS with id: " + threadId);
context.getContentResolver().delete(
Uri.parse("content://sms/" + id), null, null); …Run Code Online (Sandbox Code Playgroud) 我如何在Android中进行编码,以便我的应用程序可以分析传入的短信并可能阻止它或做某事(可能移动到不同的SMS文件夹)在SMS实际发出通知告诉用户新短信之前?我会针对Android 2.1及更高版本.
我想分析用户指定的垃圾邮件单词的传入短信,如果找到则要删除/标记为已读/将邮件移动到其他文件夹.
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(Uri.parse("content://sms/conversations/"), null,null,null, null);
Run Code Online (Sandbox Code Playgroud)
不工作为什么?
<uses-permission android:name="android.permission.READ_SMS" />
Run Code Online (Sandbox Code Playgroud)
权限已添加.
08-12 10:56:39.188: ERROR/AndroidRuntime(377): Caused by: android.database.sqlite.SQLiteException: near ",": syntax error: , while compiling: SELECT , body AS snippet FROM sms, (SELECT thread_id AS group_thread_id, MAX(date)AS group_date,COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups WHERE (sms.thread_id = groups.group_thread_id AND sms.date =groups.group_date)
08-12 10:56:39.188: ERROR/AndroidRuntime(377): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:143)
08-12 10:56:39.188: ERROR/AndroidRuntime(377): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:111)
08-12 10:56:39.188: ERROR/AndroidRuntime(377): at android.content.ContentProviderProxy.bulkQuery(ContentProviderNative.java:279)
08-12 10:56:39.188: ERROR/AndroidRuntime(377): at android.content.ContentProviderProxy.query(ContentProviderNative.java:298)
08-12 10:56:39.188: ERROR/AndroidRuntime(377): …Run Code Online (Sandbox Code Playgroud) 我目前在以下URI"content:// sms /"上注册了一个内容观察者,以监听正在发送的传入和传出消息.
这似乎工作正常,我也尝试从短信数据库中删除但我只能删除以下URI中的整个线程"content:// sms/conversations /"
这是我用于此的代码
String url = "content://sms/";
Uri uri = Uri.parse(url);
getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler));
}
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){ …Run Code Online (Sandbox Code Playgroud) 我刚刚发现了PhoneGap,并想知道是否有办法从Javascript访问SMS收件箱.或者,如果在使用HTML/CSS/JS解决方案创建的应用程序中执行此操作还有另一种简单方法.
在phonegap文档中没有关于短信访问的信息,但是收件箱可能是网址还是文件夹?
我想坚持使用phonegap,以便应用程序可以在许多设备上运行,但只有Android的解决方案也是令人满意的.
我想在用户阅读后从收件箱中删除短信.这该怎么做?
编辑:
公共类SmsReceiver扩展BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String address = null;
if(bundle!=null) {
String info = " ";
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]);
address=msgs[i].getDisplayOriginatingAddress();
info += msgs[i].getMessageBody().toString();
}
/*String str=bundle.getString("state");
Log.v("State",str);*/
if((PhoneNumberUtils.isWellFormedSmsAddress(address))){ //set ! and address length
//abortBroadcast();
Log.v("phone num","wellformed");
Uri deleteUri = Uri.parse("content://sms");
Cursor c = context.getContentResolver().query(deleteUri, null, …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,我想从收件箱中删除所有短信.为此,我使用了以下代码.
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uriSms, null,null,null,null);
int id = c.getInt(0);
int thread_id = c.getInt(1); //get the thread_id
getContentResolver().delete(Uri.parse("content://sms/conversations/" + thread_id),null,null);
Run Code Online (Sandbox Code Playgroud)
此代码不起作用.有没有办法做同样的事情?
我想从我的Android设备发送短信并从mydevice(已发送的消息)中删除它.
SMS保存在设备(4.4.4)中,但不会使用我的代码删除SMS.删除行后影响= 0(零).
我的设备vesrion是4.4.4.
在其他设备中,不保存SMS.为什么SMS会在Android 4.4.4中保存?
我不想保存我发送的短信或失败的短信(没有发送).
请帮我.
我的权限
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
Run Code Online (Sandbox Code Playgroud)
我的代码是发送短信
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(number, null, msg, null, null);
Run Code Online (Sandbox Code Playgroud)
我从处理程序调用方法deleteSMS()与postselay为5秒
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
String message = CastApplication.mPref.getString(context.getResources().getString(R.string.pref_message_to_friend), "");
deleteSMS(context, message, number);
if (MyCastFragment.getInstance() != null) {
MyCastFragment.getInstance().updateView();
}
progressDialog.dismiss();
context.finish();
}
}, 5000);
Run Code Online (Sandbox Code Playgroud)
删除短信
public void deleteSMS(Context ctx, String message, String number) {
try {
Uri uriSms = Uri.parse("content://sms");
Cursor c = …Run Code Online (Sandbox Code Playgroud) 在我的onReceive方法中我有这个代码:
if (from.equals(number)) {
abortBroadcast();
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(in);
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Not from needed number", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
其中number ="29853" - 我希望捕获的数字消息,而不是保存在收件箱中.
此代码正常工作 - 如果sms来自第一个Toast的数字,它打印消息的内容,如果sms不是来自数字"Not from needed number"打印.问题是abortBroadcast没有使其业务 - 虽然接收者的优先级是1000,但来自号码的消息仍然在手机的收件箱中:
<receiver android:name=".service_classes.MyReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"
android:priority="1000" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
有什么问题 - 为什么不abortBroadcast工作?