我一直在研究短信应用程序.直到昨天,当我将Nexus 4更新为
Android 4.4,KitKat时,一切顺利.诸如将SMS标记为已读/未读以及删除线程中的所有消息等功能已停止工作.为什么会这样?它适用于其他三星设备(不运行KitKat).
public static void markRead(final Context context,final Uri uri,final int read) { Log.d(TAG,"markRead(" + uri + "," + read + ")"); if (uri == null) { return; } String[] sel = Message.SELECTION_UNREAD; if (read == 0) { sel = Message.SELECTION_READ; } final ContentResolver cr = context.getContentResolver(); final ContentValues cv = new ContentValues(); cv.put(Message.PROJECTION[Message.INDEX_READ],read); try { cr.update(uri,cv,Message.SELECTION_READ_UNREAD,sel); } catch (IllegalArgumentException e) { Log.e(TAG,"Failed update",e); Toast.makeText(context,e.getMessage(),Toast.LENGTH_LONG).show(); } }
要删除线程中的所有消息,我使用:
public static void deleteMessages(final Context context,final int title,final int message,final Activity activity) { Log.i(TAG,"deleteMessages(..," + uri + ",..)"); final Builder builder = new Builder(context); builder.setTitle(title); builder.setMessage(message); builder.setNegativeButton(android.R.string.no,null); builder.setPositiveButton(android.R.string.yes,new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog,final int which) { final int ret = context.getContentResolver().delete( uri,null,null); Log.d(TAG,"deleted: " + ret); if (activity != null && !activity.isFinishing()) { activity.finish(); } if (ret > 0) { Conversation.flushCache(); Message.flushCache(); SmsReceiver.updateNewMessageNotification(context,null); // adapter.notifyDataSetChanged(); } try { testFromFragment(context); } catch (Exception e) { e.printStackTrace(); } } }); builder.show(); }
解决方法
在Android 4.4中,有关SMS的一些变化.其中之一是,只有注册为默认SMS应用程序的应用程序才具有对提供程序的写入权限.
Check here简要介绍了SMS的变化.
Check this link有更深入的了解.这个解释了您的应用程序需要满足哪些标准才能成为默认消息传递应用程序.
And here’s官方有趣的东西.
因此,如果您的应用程序不是默认的消息传递应用程序,那么这就是指定功能已停止工作的原因.
可以在answer here中找到默认Provider限制的可能解决方法.