app読み取り連絡先権限が許可されているかどうかを判断する

26642 ワード

最近、会社のappには、アプリケーションが許可されているかどうかを判断する必要があります.許可がなければ、ユーザーにページを開いて許可を設定するように導くのは簡単だと思っていましたが、appがオンラインになってから多くの問題が発生しました.プログラム猿の皆さんが回り道をしないように解決策を捧げます.くだらないことはあまり言わない.
各携帯電話メーカーが自分のroomを厳格にカプセル化しているため、Androidシステムを使って読み取り権限を持つapiが取得できないため、ある権限が許可されているかどうかは判断できません.例えば、現在市場で最も人気のあるOPPO携帯電話は、連絡先の権限が開かれるたびにtrueに戻るので、判断できません.この章では,主にappが読み取り連絡先に権限を与えているかどうかを検出することを例に挙げ,他の権限判断も同様である.
まず、読み取り権限のシナリオは、packageManager、Activity、Activity、Activity Compat、PermissionCheckの4つのクラスで読み取ります.たとえば、連絡先権限が開いているかどうかを判断します.
boolean permission = (PackageManager.PERMISSION_GRANTED ==
        pm.checkPermission("android.permission.READ_CONTACTS", "  "));

他の方法はネット上にたくさんありますが、ここではあまり言いません.
前述したように、様々な理由で、このpermissionは不正確な値であり、私たちはそれを手に入れた場合、権限が開いているかどうかを判断することができません.長い間試した後、有効な案をまとめました.直接連絡先を読み取ることです.私たちは非同期タスクを開いて連絡先を読み取ることができます.ここではAsyncTaskを使っています.
  protected ArrayList doInBackground(Context... voids) {
            ContentResolver resolver = context.getContentResolver();
            //   Sims    
            Uri uri = Uri.parse("content://com.android.contacts/contacts"); //  raw_contacts 
            //  _id  
            Cursor cursor = null;
            try {
                cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, null, null, "sort_key asc");
            } catch (Exception e) {
                e.printStackTrace();
            }

            if (cursor == null) {
                return null; // error
            }

            ArrayList result = new ArrayList<>();
            while (cursor.moveToNext()) {
                Contact contact = new Contact();
                StringBuilder buf = new StringBuilder();
                //  id   data     
                int id = cursor.getInt(0);
//            buf.append("id="+id);
                uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data");
                //data1mimetype       ,   、email 
                Cursor phoneCursor = resolver.query(uri, null, null, null, null);

                if (phoneCursor == null) {
                    return result;
                }

                while (phoneCursor.moveToNext()) {


//                String name = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));//     name
//                String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //     number

                    String data = phoneCursor.getString(phoneCursor.getColumnIndex("data1"));

                    if (phoneCursor.getString(phoneCursor.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")) {
                        contact.setName(data);   //     
//                    buf.append(",name="+data);
                    } else if (phoneCursor.getString(phoneCursor.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/phone_v2")) {  //     
                        if (TextUtils.isEmpty(contact.getNumber())) {
                            contact.setNumber(data);
                        } else if (TextUtils.isEmpty(contact.getNumber2())) {
                            contact.setNumber2(data);
                        } else {
                            contact.setNumber3(data);
                        }
//                    buf.append(",phone="+data);
                    } else if (phoneCursor.getString(phoneCursor.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/email_v2")) {  //   email
                        if (TextUtils.isEmpty(contact.getEmail())) {
                            contact.setEmail(data);
                        } else if (TextUtils.isEmpty(contact.getEmail2())) {
                            contact.setEmail2(data);
                        } else {
                            contact.setEmail3(data);
                        }

//                    buf.append(",email="+data);
                    } else if (phoneCursor.getString(phoneCursor.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/postal-address_v2")) { //     

                        if (TextUtils.isEmpty(contact.getAddress())) {
                            contact.setAddress(data);
                        } else if (TextUtils.isEmpty(contact.getAddress2())) {
                            contact.setAddress2(data);
                        } else {
                            contact.setAddress3(data);
                        }
//                    buf.append(",address="+data);
                    } else if (phoneCursor.getString(phoneCursor.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/organization")) {  //     
//                    buf.append(",organization=" + data);
                    }
                }

                phoneCursor.close();
                result.add(contact);
            }
            cursor.close();

            return result;
        }
doInbackgroundで読み取りが完了した後、onPostExcuteに行って読み取りの結果を判断し、結果に基づいてアプリケーションの読み取り連絡先権限がユーザーに開かれているかどうかを判断し、開かれている場合は直接対応する操作を行い、開かなければダイアログボックスを開いてユーザーにページ開く権限を設定するように導くことができます.OnPostExcuteメソッドは次のとおりです.
   protected void onPostExecute(ArrayList result) {
        loadManager.dismiss();

        if (null == result) {
            //     
            //             OPPO R9     
            final Dialog dialog = new Dialog(getActivity(), R.style.dialog);
            dialog.setContentView(R.layout.dialog_oppo_permission_help);
            dialog.setCancelable(false);
            TextView tv_step1 = (TextView) dialog.findViewById(R.id.tv_step1);
            TextView tv_step2 = (TextView) dialog.findViewById(R.id.tv_step2);
            Button btn_go = (Button) dialog.findViewById(R.id.btn_go);
            tv_step1.setText(Html.fromHtml(
                    "             "));
            tv_step2.setText(Html.fromHtml(
                    "       &quot    &quot"));
            btn_go.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dialog.dismiss();
                    Intent intent = SystemUtils.getAppDetailSettingIntent();
                    startActivityForResult(intent, 0);
                }
            });
            dialog.show();
        } else if (result.isEmpty()) {
            //      
            Toast.makeText(context, "", Toast.LENGTH_SHORT).show();
        } else {
            //        
            Intent selectContact = new Intent();
            selectContact.putExtra(ContactActivity.PARAM_NAME_TAG_FROM, MoreInfoFragment.class.getSimpleName());
            selectContact.putParcelableArrayListExtra(ContactActivity.PARAM_NAME_CONTACT_DATA, result);
            selectContact.setClass(getActivity(), ContactActivity.class);
            startActivityForResult(selectContact, 0);
        }
    }
}
doInbackgroundで読み取りが完了した後、onPostExcuteに行って読み取りの結果を判断し、結果に基づいてアプリケーションの読み取り連絡先権限がユーザーに開かれているかどうかを判断し、開かれている場合は直接対応する操作を行い、開かなければダイアログボックスを開いてユーザーにページ開く権限を設定するように導くことができます.OnPostExcuteメソッドは次のとおりです.
   protected void onPostExecute(ArrayList result) {
        loadManager.dismiss();

        if (null == result) {
            //     
            //             OPPO R9     
            final Dialog dialog = new Dialog(getActivity(), R.style.dialog);
            dialog.setContentView(R.layout.dialog_oppo_permission_help);
            dialog.setCancelable(false);
            TextView tv_step1 = (TextView) dialog.findViewById(R.id.tv_step1);
            TextView tv_step2 = (TextView) dialog.findViewById(R.id.tv_step2);
            Button btn_go = (Button) dialog.findViewById(R.id.btn_go);
            tv_step1.setText(Html.fromHtml(
                    "             "));
            tv_step2.setText(Html.fromHtml(
                    "       &quot    &quot"));
            btn_go.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dialog.dismiss();
                    Intent intent = SystemUtils.getAppDetailSettingIntent();
                    startActivityForResult(intent, 0);
                }
            });
            dialog.show();
        } else if (result.isEmpty()) {
            //      
            Toast.makeText(context, "", Toast.LENGTH_SHORT).show();
        } else {
            //        
            Intent selectContact = new Intent();
            selectContact.putExtra(ContactActivity.PARAM_NAME_TAG_FROM, MoreInfoFragment.class.getSimpleName());
            selectContact.putParcelableArrayListExtra(ContactActivity.PARAM_NAME_CONTACT_DATA, result);
            selectContact.setClass(getActivity(), ContactActivity.class);
            startActivityForResult(selectContact, 0);
        }
    }
}

また、市場ではOPPO携帯電話が多いので、携帯電話がOPPO携帯電話かどうかを判断する方法を教えてあげます.
private static boolean isOppoR9() {
    String model = Build.MODEL.toLowerCase();
    return model.contains("oppo") && model.contains("r9");
}

ページを開く権限を設定するコードは次のとおりです.
Intent intent = SystemUtils.getAppDetailSettingIntent();
startActivityForResult(intent, 0);

皆さんのお役に立てばと思います.ありがとうございます.