【问题标题】:Not getting all mail accounts in android没有在android中获取所有邮件帐户
【发布时间】:2018-02-07 06:05:15
【问题描述】:

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

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

这个return 0..有什么问题吗?

【问题讨论】:

  • 你有没有获得android.permission.GET_ACCOUNTS的权限
  • 是的,我在 AndroidManifest.xml 中有这个
  • 如果你在模拟器上测试你确定你添加了账户?
  • 在我的设备上测试 nexus 6p
  • 好的,那么剩下的就是您在尝试访问帐户之前在运行时获得此权限

标签: android email gmail


【解决方案1】:

这段代码对我有用,

在您的 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
    }
}

【讨论】:

  • 从哪里获取应用程序“MY_PERMISSIONS_REQUEST_READ_CONTACTS”的 int
  • 对不起,我的错误,如果你将 Manifest.permission.READ_CONTACTS 更改为 Manifest.permission.GET_ACCOUNTS,这样就解决了这个问题
  • MY_PERMISSIONS_REQUEST_READ_CONTACTS 是一个常量,用于检查是否一切正常,就像一个标志。该变量在 Utilities 类中建立。
【解决方案2】:

如前所述,您需要为 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 >=23 的设备,您将在运行时弹出窗口,然后一旦用户接受或拒绝该权限,您的 onRequestPermissionsResult 方法就会被调用。所以在这里你必须处理你的检查用户是否授予应用程序权限。如果是,你可以继续你的逻辑

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

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

【讨论】:

  • 如果我的应用没有活动怎么办??
猜你喜欢
  • 2014-09-08
  • 2019-07-29
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多