我一直致力于SMS应用程序。直到昨天,当我将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 Uri uri,
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();
}
答案 0 :(得分:16)
对于Android 4.4,有关SMS的一些改变。其中之一是,只有注册为默认SMS应用程序的应用程序才具有对提供程序的写入权限。
Check here简要介绍了SMS的变化。
Check this link有更深入的了解。这个解释了您的应用程序需要满足哪些标准才能成为默认消息传递应用程序。
And here's官方有趣的东西。
因此,如果您的应用不是默认的消息传递应用,那么这就是指定功能已停止工作的原因。
可以在answer here。
中找到默认提供商限制的可能解决方法