一、获取联系人、通话记录、短信的相关权限
<!-- 读取联系人信息 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 编辑联系人信息 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!-- 读取通话记录信息 -->
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<!-- 编辑通话记录信息 -->
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<!-- 拨打电话权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- 读短信权限 -->
<uses-permission android:name="android.permission.READ_SMS"/>
<!-- 写短信权限 -->
<uses-permission android:name="android.permission.WRITE_SMS"/>
<!-- 发短信 -->
<uses-permission android:name="android.permission.SEND_SMS"/>
<!-- 收短信 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
二、相关的表
1、查询联系人uri
①ContactsContract.Contacts.CONTENT_URI
②ContactsContract.Data.CONTENT_URI
2、查询通话记录uri
CollLog.Calls.CONTENT_URI
3、查询所有会话的Uri
public static final Uri CONVERSATION_URI = Uri
.parse("content://mms-sms/conversations");
4、查询短信uri
public static final Uri SMS_URI = Uri.parse("content://sms");
5、短信发件箱uripublic static final Uri SMS_SEND_URI = Uri.parse("content://sms/sent");
6、短信收件箱Uripublic static final Uri SMS_INBOX_URI = Uri.parse("content://sms/inbox");
三、实现实时对话因为收到短信时系统发出的广播是一个有序广播,我们在订阅该广播后可以将收听权限设为最高,确保我们收到短信先于系统
Action:android.provider.Telephony.SMS_RECEIVED
Priority:1000当我们定义了广播接收器并通过intent获得并解析短信
Android设备接收到的SMS是以pdu形式的(protocol description unit)。所以从intent提取数据时就会遇到pdus
public static SMS onReceiveSMS(Context context,Bundle bundle){
Object[] pdus=(Object[])bundle.get("pdus");
SmsMessage[] message = new SmsMessage[pdus.length];
for(int i=0;i<pdus.length;i++){
message[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
String address="";
long timaStam=0;
StringBuilder builder = new StringBuilder();
for(int i=0;i<message.length;i++){
if(i==0){
timaStam=message[i].getTimestampMillis();
address=message[i].getOriginatingAddress();
}
builder.append(message[i].getDisplayMessageBody());
}
SMS sms = new SMS();
sms.setBody(builder.toString());
sms.setAddress(address);
sms.setDate(timaStam);
sms.setType(1);
return sms;
}
解析完成之后,将其存入收件箱
忽略广播,不让他继续往下传递
abortBroadcast();