1.Manifest权限配置:
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
2.布局
2.1:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<Button
android:id="@+id/btn_calendar_provider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="calendarProvider"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_contacts_provider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="contactsProvider"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_sms_provider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="smsProvider"
android:textAllCaps="false" />
<Button
android:id="@+id/btn_vertifycode_provider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="vertifyCodeProvider"
android:textAllCaps="false" />
</LinearLayout>
2.2:activity_calendar_provider.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="通过日历内容提供者插入事件"
android:textAllCaps="false"
android:onClick="addAlertEvent"
/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp">
<TextView
android:id="@+id/calendar_info"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</ScrollView>
</LinearLayout>
2.3:activity_contacts_provider.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<TextView
android:id="@+id/contacts_info"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</ScrollView>
</LinearLayout>
2.4:activity_sms.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/sms_info"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</ScrollView>
</LinearLayout>
2.5:activity_verify_code.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<Button
android:id="@+id/btn_getCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取验证码"
android:layout_alignParentRight="true"/>
<EditText
android:id="@+id/phone_num_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号码"
android:padding="5dp"
android:layout_toLeftOf="@+id/btn_getCode"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/vertify_code_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入验证码"
android:padding="5dp"
android:layout_toLeftOf="@+id/btn_submit"/>
<Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="检查验证码"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</LinearLayout>
3.主页面代码
@RequiresApi(api = Build.VERSION_CODES.M)
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final int PERMISSION_REQUEST_CODE = 1;
private Button btn_calendar_provider, btn_contacts_provider,btn_sms_provider,btn_vertifycode_provider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkCalendarPermission();
}
btn_calendar_provider = findViewById(R.id.btn_calendar_provider);
btn_contacts_provider = findViewById(R.id.btn_contacts_provider);
btn_sms_provider = findViewById(R.id.btn_sms_provider);
btn_vertifycode_provider = findViewById(R.id.btn_vertifycode_provider);
btn_calendar_provider.setOnClickListener(this);
btn_contacts_provider.setOnClickListener(this);
btn_sms_provider.setOnClickListener(this);
btn_vertifycode_provider.setOnClickListener(this);
}
private void checkCalendarPermission() {
int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);
int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);
int readContactPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS);
int smsPermission = checkSelfPermission(Manifest.permission.READ_SMS);
int receivePermission = checkSelfPermission(Manifest.permission.RECEIVE_SMS);
if (readPermission == PackageManager.PERMISSION_GRANTED
&& writePermission == PackageManager.PERMISSION_GRANTED
&& smsPermission == PackageManager.PERMISSION_GRANTED
&& receivePermission == PackageManager.PERMISSION_GRANTED
&& readContactPermission == PackageManager.PERMISSION_GRANTED) {
//表示有权限
} else {
//去获取权限
//做个提示。用户点击了确定以后再去调用请求权限,
//如果点击了不再提示,就不再获取了,如果不能使用,根据产品经理的交互去写。
requestPermissions(new String[]{Manifest.permission.READ_CALENDAR,
Manifest.permission.WRITE_CALENDAR,
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_CONTACTS}, PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length == 5
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED
&& grantResults[2] == PackageManager.PERMISSION_GRANTED
&& grantResults[3] == PackageManager.PERMISSION_GRANTED
&& grantResults[4] == PackageManager.PERMISSION_GRANTED) {
//有权限
ToastUtil.showMsg(this, "有权限");
} else {
//没权限
finish();
}
}
}
@Override
public void onClick(View v) {
Intent intent = null;
switch (v.getId()) {
case R.id.btn_calendar_provider:
intent = new Intent(MainActivity.this, CalendarProviderActivity.class);
break;
case R.id.btn_contacts_provider:
intent = new Intent(MainActivity.this, ContactsProviderActivity.class);
break;
case R.id.btn_sms_provider:
intent = new Intent(MainActivity.this, SmsActivity.class);
break;
case R.id.btn_vertifycode_provider:
intent = new Intent(MainActivity.this, VerifyCodeActivity.class);
break;
}
startActivity(intent);
}
}
4.bean类:UserInfo.class
public class UserInfo {
private String id;
private String displayName;
private String phoneNumber;
public UserInfo() {
}
public UserInfo(String id, String displayName, String phoneNumber) {
this.id = id;
this.displayName = displayName;
this.phoneNumber = phoneNumber;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
5.provider的各个应用
5.1:日历中插入事件
@SuppressLint("LongLogTag")
public class CalendarProviderActivity extends AppCompatActivity {
private static final String TAG = "CalendarProviderActivity";
private TextView calendar_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calendar_provider);
calendar_info = findViewById(R.id.calendar_info);
// queryCalendars();
calendar_info.setText(queryCalendars());
}
public void addAlertEvent(View view) {
// _id === 1
long calID = 1;
Calendar beginTime = Calendar.getInstance();
// 年/月(从0开始)/日/时/分
beginTime.set(2020, 1, 10, 18, 55);
long beginTimeMills = beginTime.getTimeInMillis();
//结束时间
Calendar endTime = Calendar.getInstance();
endTime.set(2020, 1, 10, 18, 56);
long endTimeMills = endTime.getTimeInMillis();
//事件内容
/*时序*/
String timeZone = TimeZone.getDefault().getID();
Log.d(TAG, "timeZone ========= " + timeZone);
ContentValues eventValues = new ContentValues();
eventValues.put(CalendarContract.Events.DTSTART, beginTimeMills);
eventValues.put(CalendarContract.Events.DTEND, endTimeMills);
eventValues.put(CalendarContract.Events.CALENDAR_ID, calID);
eventValues.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone);
eventValues.put(CalendarContract.Events.TITLE, "手动设置闹钟提醒");
eventValues.put(CalendarContract.Events.DESCRIPTION, "叮叮咚咚咚咚咚咚~~~~");
eventValues.put(CalendarContract.Events.EVENT_LOCATION, "莆田");
//插入数据
Uri eventUri = CalendarContract.Events.CONTENT_URI;
ContentResolver contentResolver = getContentResolver();
Uri resultUri = contentResolver.insert(eventUri, eventValues);
Log.d(TAG, "resultUri ========= " + resultUri);
String eventId = resultUri.getLastPathSegment();
ContentValues reminderValues = new ContentValues();
reminderValues.put(CalendarContract.Reminders.EVENT_ID,eventId);
reminderValues.put(CalendarContract.Reminders.MINUTES,15);
reminderValues.put(CalendarContract.Reminders.METHOD,CalendarContract.Reminders.METHOD_ALERT);
//添加提醒
Uri reminderUri = CalendarContract.Reminders.CONTENT_URI;
contentResolver.insert(reminderUri, reminderValues);
}
private CharSequence queryCalendars() {
ContentResolver contentResolver = getContentResolver();
// Uri uri = Uri.parse("content://" + "com.android.calendar/" + "calendars");
Uri uri = CalendarContract.Calendars.CONTENT_URI;
Cursor query = contentResolver.query(uri, null, null, null, null);
String[] columnNames = query.getColumnNames();
StringBuilder stringBuilder = new StringBuilder();
while (query.moveToNext()) {
Log.d(TAG, " ===================== ");
for (String columnName : columnNames) {
Log.d(TAG, columnName + " === " + query.getString(query.getColumnIndex(columnName)));
stringBuilder.append(columnName + " === " + query.getString(query.getColumnIndex(columnName))+ "\n");
}
Log.d(TAG, " ===================== ");
}
return stringBuilder.toString();
}
}
5.2:手机联系人的信息
@SuppressLint("LongLogTag")
public class ContactsProviderActivity extends AppCompatActivity {
private static final String TAG = "ContactsProviderActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts_provider);
TextView contacts_info = findViewById(R.id.contacts_info);
contacts_info.setText( getUserInfo());
}
private CharSequence getUserInfo() {
ContentResolver cr = getContentResolver();
Uri rawContactUri = Uri.parse("content://" + ContactsContract.AUTHORITY + "/raw_contacts");
Log.d(TAG, "rawContactUri ====== "+rawContactUri);
Cursor rawContactCursor = cr.query(rawContactUri, new String[]{"contact_id","display_name"}, null, null, null);
Log.d(TAG, "rawContactCursor: " + rawContactCursor);
List<UserInfo> userInfos = new ArrayList<>();
StringBuilder stringBuilder = new StringBuilder();
while (rawContactCursor.moveToNext()) {
UserInfo userInfo = new UserInfo();
userInfo.setId(rawContactCursor.getString(rawContactCursor.getColumnIndex("contact_id")));
userInfo.setDisplayName(rawContactCursor.getString(rawContactCursor.getColumnIndex("display_name")));
// userInfo.setPhoneName(rawContactCursor.getString(rawContactCursor.getColumnIndex("display_name")));
userInfos.add(userInfo);
}
rawContactCursor.close();
//获取手机号码
Uri phoneUri = Uri.parse("content://" + ContactsContract.AUTHORITY + "/data/phones");
for (UserInfo userInfo : userInfos) {
Cursor phoneCursor = cr.query(phoneUri, new String[]{"data1"}, "raw_contact_id=?", new String[]{userInfo.getId()}, null);
if (phoneCursor.moveToNext()) {
userInfo.setPhoneNumber(phoneCursor.getString(0).replace("-", ""));
stringBuilder.append(userInfo.getDisplayName()+" ");
stringBuilder.append(userInfo.getPhoneNumber() + "\n");
}
phoneCursor.close();
}
return stringBuilder.toString();
}
}
5.3:获取手机短信内容(需要通知类短信权限,暂时未解决,需手动开启)
public class SmsActivity extends AppCompatActivity {
private static final String TAG = "SmsActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sms);
TextView sms_info = findViewById(R.id.sms_info);
sms_info.setText(getSmsContent());
}
public CharSequence getSmsContent(){
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
Cursor query = contentResolver.query(uri, null, null, null, null);
String[] columnNames = query.getColumnNames();
StringBuilder stringBuilder = new StringBuilder();
while (query.moveToNext()) {
for (String columnName : columnNames) {
Log.d(TAG, columnName + "===" + query.getString(query.getColumnIndex(columnName)));
stringBuilder.append(columnName + "===" + query.getString(query.getColumnIndex(columnName)) + "\n");
}
stringBuilder.append("\n------------------------------------ \n\n");
}
query.close();
return stringBuilder.toString();
}
}
public class VerifyCodeActivity extends AppCompatActivity {
private static final String TAG = "VerifyCodeActivity";
private Button btn_getCode,btn_submit;
private EditText phone_num_et,vertify_code_et;
private static UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int MATCH_CODE = 1;
static {
sUriMatcher.addURI("sms","#",MATCH_CODE);
}
private CountDownTimer mCountDownTimer = new CountDownTimer(60*1000,1000) {
@Override
public void onTick(long millisUntilFinished) {
btn_getCode.setEnabled(false);
btn_getCode.setText(String.format("重新获取(%d)",millisUntilFinished/1000));
}
@Override
public void onFinish() {
btn_getCode.setEnabled(true);
btn_getCode.setText(String.format("获取验证码"));
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_verify_code);
btn_getCode = findViewById(R.id.btn_getCode);
btn_submit = findViewById(R.id.btn_submit);
phone_num_et = findViewById(R.id.phone_num_et);
vertify_code_et = findViewById(R.id.vertify_code_et);
btn_getCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNum = phone_num_et.getText().toString().trim();
if (TextUtils.isEmpty(phoneNum)) {
ToastUtil.showMsg(VerifyCodeActivity.this,"手机号码不能为空");
return;
}
mCountDownTimer.start();
}
});
btn_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNum = phone_num_et.getText().toString().trim();
String vertifyCode = vertify_code_et.getText().toString().trim();
if (TextUtils.isEmpty(phoneNum) || TextUtils.isEmpty(vertifyCode)) {
ToastUtil.showMsg(VerifyCodeActivity.this,"验证码/手机号码不能为空");
return;
}
}
});
//注册短信内容的观察者
Uri uri = Uri.parse("content://sms/");
getContentResolver().registerContentObserver(uri, true, new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange, Uri uri) {
if (sUriMatcher.match(uri) == MATCH_CODE) {
Log.d(TAG, "selfChange ---> "+selfChange);
Log.d(TAG, "uri ---> "+uri);
Cursor query = getContentResolver().query(uri, new String[]{"body"}, null, null, null);
StringBuilder stringBuilder = new StringBuilder();
if (query.moveToNext()) {
String body = query.getString(0);
Log.d(TAG, "body -------- 》 " + body);
stringBuilder.append(body);
handlerBody(body);
}
ToastUtil.showMsg(VerifyCodeActivity.this,stringBuilder.toString());
query.close();
}
}
});
}
private void handlerBody(String body) {
if (!TextUtils.isEmpty(body) && body.startsWith("【阳光学院】")) {
Pattern p = Pattern.compile("(?<![0-9]{4})(?![0-9])");
Matcher matcher = p.matcher(body);
boolean contain = matcher.find();
if (contain) {
Log.d(TAG, "vertifyCode -------- > "+ matcher.group());
ToastUtil.showMsg(VerifyCodeActivity.this,matcher.group());
vertify_code_et.setText(matcher.group());
vertify_code_et.setFocusable(true);
}
}
}
}