Getting the Gmail Id of the User In Android 6.0 marshmallow

别来无恙 提交于 2019-12-01 09:34:35

问题


I am getting email id by using android.permission.GET_ACCOUNTS permission.

 try {
            Account[] accounts = AccountManager.get(this).getAccountsByType("com.google");
            for (Account account : accounts) {
                emailid = account.name;
                Log.e("account",emailid);
            }
        } catch (Exception e) {
            Log.i("Exception", "Exception:" + e);
        }

This code is working on all devices upto Lollipop 5.1. But its not working in Marshmallow 6.0.

Can anyone help me to resolve this problem. I am not even getting any errors in logcat.


回答1:


This code is working, Tested on Android 4.4.4, 5.0.1, 6.0 and 6.0.1

String possibleEmail = "";
    final Account[] accounts = AccountManager.get(context).getAccounts();
    //Log.e("accounts","->"+accounts.length);
    for (Account account : accounts) {
        if (Patterns.EMAIL_ADDRESS.matcher(account.name).matches()) {
            possibleEmail = account.name;
        }
    }

possibleEmail is the email of the device.




回答2:


You need to add run-time permission for Android 6.0 marshmallow. This is working code.

// Check my test phone os version that is it marshmallow. Use this inside onCreate method.

   private static final int REQUEST_GET_ACCOUNT = 112;

  if(android.os.Build.VERSION.SDK_INT > 22){
            if(isGETACCOUNTSAllowed()){
               // do your task 

                getMailAddress();
                return;
            }else{
                requestGET_ACCOUNTSPermission();
            }

        }

// check have you already run-time permission for marshmallow or not.

private boolean isGETACCOUNTSAllowed() {
        //Getting the permission status
        int result = ContextCompat.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS);

        //If permission is granted returning true
        if (result == PackageManager.PERMISSION_GRANTED)
            return true;

        //If permission is not granted returning false
        return false;
    }


 //if you don't have the permission then Requesting for permission
   private void requestGET_ACCOUNTSPermission(){

        if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.GET_ACCOUNTS)){


        }

        //And finally ask for the permission
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.GET_ACCOUNTS},REQUEST_GET_ACCOUNT);
    }

// at last check onRequestPermissionsResult @Override method for checking user allow permission or not. if allow then possibleEmail is your mail address.

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        //Checking the request code of our request
        if(requestCode == REQUEST_GET_ACCOUNT){

            //If permission is granted
            if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){


                Toast.makeText(this,"Thanks You For Permission Granted ",Toast.LENGTH_LONG).show();

           getMailAddress();

            }else{
                //Displaying another toast if permission is not granted
                Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show();
            }
        }

}


public void getMailAddress(){

          String possibleEmail = null;

            Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
            Account[] accounts = AccountManager.get(context).getAccountsByType(
                    "com.google");
            for (Account account : accounts) {
                if (emailPattern.matcher(account.name).matches()) {
                    possibleEmail = account.name;
                    Log.i("MY_EMAIL_count", "" + possibleEmail);
                }
            }

}



回答3:


Example as a separate service class to be easily used in different situations by calling getGMailAccount method.

public class GMailAccountService {

private static final int MIN_SDK_FOR_REQUESTING_GET_ACCOUNTS = 22;
private static final int GET_ACCOUNTS_PERMISSION_REQUEST_CODE = 112;

private Activity activity;

public GMailAccountService(Activity activity) {
    this.activity = activity;
}

public String getGMailAccount() {
    if(android.os.Build.VERSION.SDK_INT > MIN_SDK_FOR_REQUESTING_GET_ACCOUNTS){
        if(!isGetAccountsPermissionAllowed()){
            requestGetAccountsPermission();
            return getGMailAccount();
        }
    }
    return extractAddressFromAccountManager();
}

private boolean isGetAccountsPermissionAllowed() {
    int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.GET_ACCOUNTS);
    if (result == PackageManager.PERMISSION_GRANTED)
        return true;
    return false;
}

private void requestGetAccountsPermission(){
    ActivityCompat.shouldShowRequestPermissionRationale(activity, android.Manifest.permission.GET_ACCOUNTS);
    ActivityCompat.requestPermissions(activity,new String[]{android.Manifest.permission.GET_ACCOUNTS}, GET_ACCOUNTS_PERMISSION_REQUEST_CODE);
}


public String extractAddressFromAccountManager(){

    Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8
    Account[] accounts = AccountManager.get(activity).getAccountsByType("com.google");
    for (Account account : accounts) {
        if (emailPattern.matcher(account.name).matches()) {
            return account.name;
        }
    }
    return null;
}

}



来源:https://stackoverflow.com/questions/35789071/getting-the-gmail-id-of-the-user-in-android-6-0-marshmallow

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!