天天看點

Android寫入聯系人

擷取寫入的權限

在AndroidManifest.xml中添加下面這句請求權限

在activity頁面直接利用try,catch寫入聯系人

try {
            insertConstacts();
        } catch (Exception e) {
            getWrieteConstactsPermission();
        }
           
  • insertConstacts()方法如下:
public void insertConstacts() {

        ContentValues values = new ContentValues();
        Uri rawContactUri = mContext.getContentResolver().insert(
                ContactsContract.RawContacts.CONTENT_URI, values);//EPApplication是我定義的Application的子類,getContextObject方法傳回的是context
        long rawContactId = ContentUris.parseId(rawContactUri);
        // 表插入姓名資料
        values.clear();
        values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
        values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);// 内容類型
        values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, "維拉報警電話");
        mContext.getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
                values);

        //寫入電話
        values.clear();
        values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
        values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "95213176");
        values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        mContext.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);

        //寫入頭像
        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, , out);
        try {
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        values.clear();
        values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
        values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
        values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray());
        mContext.getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
                values);
    }
           
  • 最開始會因為沒有權限而進入catch,會執行的是getWrieteConstactsPermission()方法,此方法主要是申請權限和調用onRequestPermissionsResult()回調。

    來看一下getWrieteConstactsPermission()方法:

private void getWrieteConstactsPermission() {
        if (ContextCompat.checkSelfPermission(mContext, android.Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED){
            if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity,
                    android.Manifest.permission.WRITE_CONTACTS)){
               new AlertDialog.Builder(mContext).setTitle("維拉将擷取寫入聯系人權限").setPositiveButton("接受", (dialog, which) -> ActivityCompat.requestPermissions(mActivity,
                       new String[]{android.Manifest.permission.WRITE_CONTACTS},
                       WRITE_PERMISSION_REQUEST)).setNegativeButton("拒絕", (dialog, which) -> Toast.makeText(mContext, "使用者拒絕擷取聯系人權限!", Toast.LENGTH_SHORT).show()).show();
            }else {
                ActivityCompat.requestPermissions(mActivity,
                        new String[]{android.Manifest.permission.WRITE_CONTACTS},
                        WRITE_PERMISSION_REQUEST);
            }
        }
    }
           
  • 當使用者允許擷取寫入權限,WRITE_PERMISSION_REQUEST是個整型資料,作為onRequestPermissionsResult()的requestCode。
    • 是以在activity中需要重寫onRequestPermissionsResult()方法。
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.i("lgq","requestCode:" + requestCode);
        if(requestCode == ConstactsUtils.WRITE_PERMISSION_REQUEST){
            if (grantResults.length >  && grantResults[] == PackageManager.PERMISSION_GRANTED) {
                constacts.insertConstacts();
            }
        }
    }
           
  • 看出來了把,此處調用了insertConstacts()方法,也就是申請到權限後立馬寫入聯系人,ok!到此就可以結束了。

打卡收工!!