Android Read联系人运行时权限无效

时间:2016-11-17 05:55:50

标签: android android-runtime

我正在开发一个需要访问手机中联系人的应用程序。此方法在线程内执行。但是当应用程序第一次启动时它会崩溃,并说android.permission.READ_CONTACTS或android.permission.READ_CONTACTS需要作为错误。一旦按下确定错误弹出对话框。它重新启动它自我要求许可,并正常工作。在某些手机中,它没有显示任何错误或对话框。

这是onCreateView方法中片段内的代码,用于检查是否已经授予了权限

if (ContextCompat.checkSelfPermission(this, 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(this, "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);
        }
    }

这是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>

我做错了什么。在棉花糖下面工作正常。 requestPermissions方法。

这是存储库https://chathurangaJ@bitbucket.org/chathurangaJ/sms-scheduler.git的链接 我被困在这里2周了,请帮忙。

我尝试调试它。一旦应用程序到达

,就会出现此错误

3 个答案:

答案 0 :(得分:0)

如果打开菜单并长按您的应用程序,然后显示选项1.app info和2.uninstall,只需将您的应用程序拖动到应用程序信息,然后您将看到存储和数据使用情况等..,然后查看权限选项打开并检查联系人权限是否存在,如果有联系人只是启用并运行您的应用程序,您将收到联系,或者您的代码可能有问题,如果您有任何权限详细信息,请检查以下链接, https://developer.android.com/training/permissions/requesting.html

答案 1 :(得分:0)

private boolean checkPermission(){
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_CONTACTS)) {
                Toast.makeText(getActivity(), "Contact read permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getActivity().getPackageName(), null));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivityForResult(intent, 789);
                return false;
            }else {
               requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 123);
                return false;
            }
        }
        return true;
    }

使用此方法检查API级别23或更高级别的运行时权限, 如果用户允许,它会在运行时向您显示一个权限对话框,如果拒绝则一切正常,那么您必须再次检查权限以防止应用程序崩溃,

在使用此代码之前,请添加联系人阅读权限。 希望它会对你有所帮助。

注意

  1. 在AppCompatActivity中使用方法 ActivityCompat.requestpermissions
  2. 在v4支持片段中,您应使用 requestpermissions
  3. Catch是您在片段中调用 AppcompatActivity.requestpermissions 然后回调将进入活动而不是片段
  4. 4.确保从活动的 onRequestPermissionsResult 中调用 super.onRequestPermissionsResult

答案 2 :(得分:0)

这是你的方法并且工作正常我已经检查过,请尝试使用 onCreateView 方法进行调用。

private void check(){


        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();
                }else {
                    ActivityCompat.requestPermissions(getActivity(),
                            new String[]{Manifest.permission.READ_CONTACTS},
                            1);                }

            }
        }


    }

并确保您已在 AndroidManifest.xml

中应用使用权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xyz">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

从以下地址致电:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_contact, container, false);

        check();


        return view;
    }