簡體   English   中英

使用Google Play服務訪問用戶電子郵件的G +登錄會丟失android.permission.GET_ACCOUNTS

[英]G+ login using Google Play Services accessing user email throws Missing android.permission.GET_ACCOUNTS

我正在開發具有社交登錄功能的應用程序。 所以我創建了一個android-library項目,其角色是用g +,FB等提供社交登錄。我的應用程序正在使用這個android-library項目進行社交登錄。 但現在我面臨的問題如下所述。

我使用g +成功登錄。

但是當我試圖登錄用戶電子郵件時

String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

我得到了異常堆棧跟蹤

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)

我在我的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>

任何人都可以指導我出錯了什么?

如果這是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;
    }
}

代替

String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

當用戶允許或禁止權限時,將調用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);
    }
}

如果您想了解有關權限的新規則的更多信息,我建議您閱讀本文http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/恩

我認為你的清單格式不正確,試試這個:

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

有關更多信息,請查看有關清單的Android文檔

清單條目是錯誤的,您需要在應用程序標記之外放置權限和使用權限

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM