使用Google Play服务访问用户电子邮件的G +登录会丢失android.permission.GET_ACCOUNTS

Ash*_*ali 5 android google-plus google-play-services

我正在开发具有社交登录功能的应用程序.所以我创建了一个android-library项目,其角色是用g +,FB等提供社交登录.我的应用程序正在使用这个android-library项目进行社交登录.但现在我面临的问题如下所述.

我使用g +成功登录.

但是当我试图登录用户电子邮件时

String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
Run Code Online (Sandbox Code Playgroud)

我得到了异常堆栈跟踪

W/System.err? java.lang.SecurityException: Missing android.permission.GET_ACCOUNTS
W/System.err? at android.os.Parcel.readException(Parcel.java:1474)
W/System.err? at android.os.Parcel.readException(Parcel.java:1427)
W/System.err? at com.google.android.gms.plus.internal.zzd$zza$zza.getAccountName(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

我在我的android-library项目中添加了uses-permission标签.下面是android-libray清单文件.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="login.social">

    <application >
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

任何人都可以指导我出错了什么?

小智 11

如果这是Android版本6(或更高版本)的问题,并且您使用Android SDK 23进行编译,并且您已经仔细检查了GET_ACCOUNTS权限是否在Manifest中,则问题可能是Android的运行时权限的新规则.

从Android版本6开始,当应用程序首次使用这些权限时,必须要求用户获得某些权限(即使它已经在Manifest中).

你可以像这样解决这个问题:

把这部分代码

if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

    int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.GET_ACCOUNTS);
    if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[] {Manifest.permission.GET_ACCOUNTS}, 
            REQUEST_CODE_ASK_PERMISSIONS);
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

代替

String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
Run Code Online (Sandbox Code Playgroud)

当用户允许或禁止权限时,将调用onRequestPermissionsResult方法,然后您可以请求发送电子邮件.

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_PERMISSIONS:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                String email = Plus.AccountApi.getAccountName(mGoogleApiClient);
                Utils.showToast("Hello " + email, mContext);                      
            } else {
                // Permission Denied
                Utils.showToast("GET_ACCOUNTS Denied", mContext);
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关权限的新规则的更多信息,我建议您阅读本文http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/恩


ave*_*ler 5

我认为你的清单格式不正确,试试这个:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="login.social">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <application >
      <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看 有关清单的android文档.