![](/img/trans.png)
[英]Android 6 getAccountName() Missing 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.