Android 使用新的电话内容提供程序读取SMS
根据,新版本提供了以下功能: 允许应用在设备上读写短信和彩信 我找不到有关此功能的任何信息,也找不到新SDK中的任何示例。这就是我到目前为止阅读新消息的方法Android 使用新的电话内容提供程序读取SMS,android,sms,Android,Sms,根据,新版本提供了以下功能: 允许应用在设备上读写短信和彩信 我找不到有关此功能的任何信息,也找不到新SDK中的任何示例。这就是我到目前为止阅读新消息的方法 public List<String> getAllSmsFromProvider() { List<String> lstSms = new ArrayList<String>(); ContentResolver cr = mActivity.getContentResolver();
public List<String> getAllSmsFromProvider() {
List<String> lstSms = new ArrayList<String>();
ContentResolver cr = mActivity.getContentResolver();
Cursor c = cr.query(Telephony.Sms.Inbox.CONTENT_URI, // Official CONTENT_URI from docs
new String[] { Telephony.Sms.Inbox.BODY }, // Select body text
null,
null,
Telephony.Sms.Inbox.DEFAULT_SORT_ORDER); // Default sort order
int totalSMS = c.getCount();
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
lstSms.add(c.getString(0));
c.moveToNext();
}
} else {
throw new RuntimeException("You have no SMS in Inbox");
}
c.close();
return lstSms;
}
但是,我想阅读设备上存储的现有信息:
// Can I only listen for incoming SMS, or can I read existing stored SMS?
SmsMessage[] smsList = Telephony.Sms.Intents.getMessagesFromIntent(intent);
for(SmsMessage sms : smsList) {
Log.d("Test", sms.getMessageBody())
}
请注意:我知道如何使用,但不支持此方法。根据链接的API,我应该能够以受支持的方式完成此操作。我几天前发现了此功能,不记得是从哪个站点找到的; 只有当用户选择将应用程序设置为默认sms应用程序时,才能还原消息。这可能会也可能不会完全回答您的问题。我还没试过这个
String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);
我是这样做的。创建SMSObject:
public class SMSObject {
private String _id;
private String _address;
private String _msg;
private String _readState; // "0" for have not read sms and "1" for have
// read sms
private String _time;
private String _folderName;
//+ getter and setter methods and
@Override
public String toString() {
return "SMSObject [_id=" + _id + ", _address=" + _address + ", _msg="
+ _msg + ", _readState=" + _readState + ", _time=" + _time
+ ", _folderName=" + _folderName + "]";
}
这里有一个简单的函数,它只记录所有当前的SMS对象
private void readSMS() {
List<SMSObject> lstSms = new ArrayList<SMSObject>();
SMSObject objSms = new SMSObject();
Uri message = Uri.parse("content://sms/");
ContentResolver cr = this.getContentResolver();
Cursor c = cr.query(message, null, null, null, null);
// this.startManagingCursor(c);
int totalSMS = c.getCount();
Log.d("SMS Count->", "" + totalSMS);
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
objSms = new SMSObject();
objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
objSms.setAddress(c.getString(c
.getColumnIndexOrThrow("address")));
objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
objSms.setReadState(c.getString(c.getColumnIndex("read")));
objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));
if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
objSms.setFolderName("inbox");
} else {
objSms.setFolderName("sent");
}
lstSms.add(objSms);
Log.d("SMS at " + i, objSms.toString());
c.moveToNext();
}
}
// else {
// throw new RuntimeException("You have no SMS");
// }
c.close();
// return lstSms;
}
private void readSMS(){
List lstSms=new ArrayList();
SMSObject objSms=新的SMSObject();
Uri消息=Uri.parse(“content://sms/");
ContentResolver cr=this.getContentResolver();
游标c=cr.query(消息,null,null,null,null);
//这个.startManagingCursor(c);
int totalSMS=c.getCount();
Log.d(“SMS计数->”,“+totalSMS”);
if(c.moveToFirst()){
对于(int i=0;i
看起来您可以使用该类使其正常工作。这个包裹是免费的
尽管下面的代码使用内容提供者方法,但这现在是API级别19(KitKat)中添加的官方API,用于读取SMS消息
public List<String> getAllSmsFromProvider() {
List<String> lstSms = new ArrayList<String>();
ContentResolver cr = mActivity.getContentResolver();
Cursor c = cr.query(Telephony.Sms.Inbox.CONTENT_URI, // Official CONTENT_URI from docs
new String[] { Telephony.Sms.Inbox.BODY }, // Select body text
null,
null,
Telephony.Sms.Inbox.DEFAULT_SORT_ORDER); // Default sort order
int totalSMS = c.getCount();
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
lstSms.add(c.getString(0));
c.moveToNext();
}
} else {
throw new RuntimeException("You have no SMS in Inbox");
}
c.close();
return lstSms;
}
public List getAllSmsFromProvider(){
List lstSms=new ArrayList();
ContentResolver cr=mActivity.getContentResolver();
游标c=cr.query(Telephony.Sms.Inbox.CONTENT\u URI,//来自文档的官方内容\u URI
新字符串[]{Telephony.Sms.Inbox.BODY},//选择正文文本
无效的
无效的
Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);//默认排序顺序
int totalSMS=c.getCount();
if(c.moveToFirst()){
对于(int i=0;i
对问题进行了澄清。我只对阅读短信感兴趣,真的不想将我的应用设置为默认短信应用。这使用了不支持的content://sms/
内容解析器。问题是专门关于使用电话API以支持的方式执行此操作。哦,对不起。。。没有意识到这一点问题并不清楚,我更新了以澄清这一点:)@RGraham我只是查看了一下API。看起来你只能阅读新的短信,但不能阅读已经收到的短信。由于目前只有一个应用程序管理短信内容,这在某种程度上是有意义的。。但是文档真的很差…太棒了,谢谢!看起来这和发布的API@longilong是一样的,只是现在已经有了官方文档,所以我很高兴使用它。如果你可以更新答案来解释它现在是API的官方部分,并显示一些代码,我可以将其标记为答案。我更新了你答案上的代码,以便更好地说明新API的用法。再次感谢!如果我的应用程序是默认sms应用程序,则使用什么URI将sms写入sms提供商?是否有类似的文档URI用于将邮件写入收件箱和已发送邮件?Telephony.Sms.inbox.CONTENT\u URI在从收件箱删除邮件时提供非法参数异常未知URL。你知道怎么解决吗?