Provider的使用(一)

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();
    }
}

5.4:获取手机短信验证码内容(用模拟器模拟发送短信,本部分存在bug,详情请参考https://www.sunofbeach.net/a/1193548231150141440

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);
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容