没有在android中获得所有邮件帐户

时间:2017-08-29 17:22:14

标签: android email gmail

我想获取所有连接到Android设备的邮件

Account[] accounts = AccountManager.get(this).getAccounts();
accounts.length;

返回0 ..是否有问题?

2 个答案:

答案 0 :(得分:0)

此代码适用于我,

在AnroidManifest.xml中

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

公用事业类:

public class Utilities {
      //Flag
      public static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 200;
      /*Function to get all google accounts saved in the device.*/
      public static Account[] getAccounts(Context context) {
      //Custom exception to check if context is null
      if (context == null)
        new Throwable("Context is null!!");
      AccountManager accountManager = AccountManager.get(context); 
      Account[] accounts = accountManager.getAccountsByType("com.google");
      if (accounts == null) {
        Log.d("getAccounts","Accounts is null");
        return null;
      } else {
        return accounts;
      }
   }
}

请记住,android 6.0和上级我们需要该用户授予此操作的权限。为此,我们可以采用Android文档中使用的示例 https://developer.android.com/training/permissions/requesting.html

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

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

        // 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.
    }
}

控制权限响应:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

答案 1 :(得分:0)

如上所述,您需要为Android M及更高版本添加运行时权限。要请求任何权限,您可以使用以下代码并添加所需的权限。这是在访问与权限相关的任何数据

之前通过请求它们来处理运行时权限的方法
public  boolean isPermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {

    if (checkSelfPermission(android.Manifest.permission.GET_ACCOUNTS)
            == PackageManager.PERMISSION_GRANTED ) {
        Log.v(TAG,"Permission is granted");
        return true;
    } else {

        Log.v(TAG,"Permission is revoked");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_ACCOUNTS}, 1);
        return false;
    }
}
else { //permission is automatically granted on sdk<23 upon installation
    Log.v(TAG,"Permission is granted");
    return true;
}
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 0:
            boolean isPerpermissionForAllGranted = false;
            if (grantResults.length > 0 && permissions.length==grantResults.length) {
                for (int i = 0; i < permissions.length; i++){
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED){
                        isPerpermissionForAllGranted=true;
                    }else{
                        isPerpermissionForAllGranted=false;
                    }
                }

                Log.e("value", "Permission Granted, Now you can use local drive .");
            } else {
                isPerpermissionForAllGranted=true;
                Log.e("value", "Permission Denied, You cannot use local drive .");
            }
            if(isPerpermissionForAllGranted){
                shoro();
            }
            break;
        }
    }

执行此操作后,对于API&gt; = 23的设备,您将在运行时弹出,然后在用户接受权限或拒绝权限后,将调用onRequestPermissionsResult方法。所以在这里你必须处理你的检查是否用户授予了应用程序的权限。如果是,您可以继续使用您的逻辑

所以在您获取代码中的帐户详细信息之前调用isPermissionGranted方法,如果是,请运行您的代码。

if(isPermissionGranted())
{
   Account[] accounts = AccountManager.get(this).getAccounts();
   accounts.length;
 }