发生Android java.lang.SecurityException

发生Android java.lang.SecurityException,java,android,Java,Android,我是Android新手。我正在通过启动应用程序开发拨号器。我从菜单中隐藏我的应用程序图标。我在jellybean和Kitkat设备中成功地从拨号器打开了应用程序,但当我在棒棒糖和棉花糖系统中打开应用程序时,我遇到了如下异常: E/GooglePlusContactsSync: Failed to clear out contacts java.lang.SecurityException

我是Android新手。我正在通过启动应用程序开发拨号器。我从菜单中隐藏我的应用程序图标。我在jellybean和Kitkat设备中成功地从拨号器打开了应用程序,但当我在棒棒糖和棉花糖系统中打开应用程序时,我遇到了如下异常:

E/GooglePlusContactsSync: Failed to clear out contacts
                                                       java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{ff7ceee 26321:com.google.android.apps.plus/u0a89} (pid=26321, uid=10089) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
                                                           at android.os.Parcel.readException(Parcel.java:1620)
                                                           at android.os.Parcel.readException(Parcel.java:1573)
                                                           at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3594)
                                                           at android.app.ActivityThread.acquireProvider(ActivityThread.java:4799)
                                                           at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2018)
                                                           at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1466)
                                                           at android.content.ContentResolver.query(ContentResolver.java:475)
                                                           at android.content.ContentResolver.query(ContentResolver.java:434)
                                                           at dit.a(PG:440)
                                                           at dit.b(PG:1388)
                                                           at diu.run(PG:325)
                                                           at java.lang.Thread.run(Thread.java:818)

E/DatabaseUtils: Writing exception to parcel
                                            java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/fs_id from pid=2208, uid=10089 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
                                                at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605)
                                                at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480)
                                                at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
                                                at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
                                                at android.os.Binder.execTransact(Binder.java:453)
然后应用程序自动关闭。

安卓6.0(棉花糖)引入了一种处理安卓权限的新方法

从Android 6.0(API级别23)开始,用户向 应用程序运行时,而不是安装应用程序时。这 这种方法简化了应用程序安装过程,因为用户不需要 安装或更新应用程序时需要授予权限。它也 让用户能够更好地控制应用程序的功能;例如 用户可以选择让摄像头应用程序访问摄像头,但不允许 到设备位置。用户可以随时撤销权限 时间,转到应用程序的设置屏幕

您需要在清单中声明您的权限。 检查当前状态:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);
并在需要时请求他们:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

为了处理Android中的运行时权限,我通常使用。它确实有助于减少代码样板

在Android 6.0中,我们需要检查权限是否已授予,因此,为了读取联系人,您需要首先检查read_contacts权限是否已授予

尝试:

和侦听器在授予权限后

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 101:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission granted
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    }

我还动态检查权限,但它不起作用。我试试这个代码。
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 101:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission granted
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    }