0

電話で連絡先にアクセスするために必要なアプリケーションを開発しています。このメソッドはスレッド内で実行されます。しかし、アプリを初めて起動すると、クラッシュし、android.permission.READ_CONTACTSまたは android.permission.READ_CONTACTSエラーとして要求されます。エラーポップアップダイアログボックスでOKを押すとすぐに。許可を求めて自己再起動し、正常に動作します。

パーミッションがすでに付与されているかどうかを確認する onCreateView メソッドのフラグメント内のコードを次に示します。

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS)
                == PackageManager.PERMISSION_GRANTED) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    getContacts();
                }
            };
            Thread thread = new Thread(r);
            thread.start();
        }else{
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {
                    Toast.makeText(getActivity(),"Read contacts permission is required to function app correctly",Toast.LENGTH_LONG)
                            .show();
                }
                requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS);
            }
        }

これが onRequestPermissionsResult メソッドです。

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case REQUEST_READ_CONTACTS :
                Runnable r = new Runnable() {
                    @Override
                    public void run() {
                        getContacts();
                    }
                };
                Thread thread = new Thread(r);
                thread.start();
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

get contact メソッドのコードは次のとおりです。

public void getContacts() {
        ContentResolver cr = getActivity().getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        if (cur != null) {
            if (cur.getCount() > 0) {
                while (cur.moveToNext()) {
                    String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                    String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    String imgPath = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
                    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                        Cursor ncur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
                        if (ncur != null) {
                            while (ncur.moveToNext()) {
                                String phoneNumber = ncur.getString(ncur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                String reDefinedPhoneNumber = "";
                                if (phoneNumber.contains("-")) {
                                    String[] split = phoneNumber.split("-");

                                    for (String k : split) {
                                        reDefinedPhoneNumber = reDefinedPhoneNumber.concat(k);
                                    }
                                } else if (phoneNumber.contains(" ")) {
                                    String[] split = phoneNumber.split(" ");
                                    for (String k : split) {
                                        reDefinedPhoneNumber = reDefinedPhoneNumber.concat(k);
                                    }
                                } else {
                                    reDefinedPhoneNumber = phoneNumber;
                                }
                                Contact contact = new Contact();
                                contact.setId(contact.getId());
                                contact.setName(name);
                                contact.setNumber(reDefinedPhoneNumber);
                                contact.setImgPath(imgPath);
                                contacts.add(contact);
                            }
                            ncur.close();
                        }
                    }
                }
            }
            cur.close();
        }
    }

これが AndroidManifest.xml コードです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.shan.chathuranga.smsscheduler">

    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

</manifest>

私は何を間違っていますか。マシュマロの下でうまく機能します。

4

0 に答える 0