app 연락처 읽기 권한이 부여되었는지 판단
                                            
 26774 단어  안드로이드 기술
                    
각 휴대전화 제조업체가 자신의 룸에 대해 엄격한 봉인을 했기 때문에 우리는 안드로이드 시스템을 사용하여 읽기 권한이 있는지의api를 가져올 수 없기 때문에 어떤 권한이 이미 권한을 부여받았는지 판단할 수 없다. 예를 들어 현재 시장에서 가장 핫한 OPPO 휴대전화는 연락처 권한이 열렸는지 읽을 때마다 항상true로 되돌아오기 때문에 판단할 수 없다.이 장에서 우리는 주로 앱이 연락처를 읽는 데 권한을 부여하는지 검사하는 것을 예로 들면 다른 권한 판단도 마찬가지다.
우선 읽기 권한의 방안은 네 가지가 있는데 그것이 바로 패키지 매니저,Activity,Activity Compat,PermissionCheck 등 네 가지 종류를 통해 읽는다. 예를 들어 연락처 권한이 열려 있는지 판단하는 것이다.
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");
                //data1          ,mimetype       ,   、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(
                    "       "    ""));
            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(
                    "       "    ""));
            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);
        }
    }
}
   또한, 시장에는 오포폰이 많기 때문에 오포폰인지 아닌지를 판단하는 방법은 다음과 같습니다.
private static boolean isOppoR9() {
    String model = Build.MODEL.toLowerCase();
    return model.contains("oppo") && model.contains("r9");
}  설정 페이지로 들어가서 사용 권한을 여는 코드는 다음과 같습니다.
Intent intent = SystemUtils.getAppDetailSettingIntent();
startActivityForResult(intent, 0);  여러분께 도움이 되었으면 좋겠습니다. 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView가 입력박스를 눌렀을 때 핸드폰 소프트 키보드에 문제가 없었다WebView에 입력란이 있을 때 누르면 핸드폰 소프트 키보드가 호출되지 않습니다.웹뷰에 초점을 맞추면 된다고 인터넷에서 검색해 보세요.방법이 호출되었습니다. 코드는 다음과 같습니다: 웹 뷰.requestFocus(...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.