2017-08-29 105 views
0

我希望所有的邮件帐户来获取连接到Android设备没有得到Android中

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

返回0 ..有什么不对的所有邮件?

+1

您参加'android.permission.GET_ACCOUNTS'许可 –

+0

是的,我有这个在AndroidManifest.xml <使用许可权的android:NAME = “android.permission.GET_ACCOUNTS”/> –

+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和上司,我们需要的是用户授予此操作的权限。为此,我们可以采取https://developer.android.com/training/permissions/requesting.html的Android文档中使用的示例:

// 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 
    } 
} 
+0

在哪里得到int的应用程序“MY_PERMISSIONS_REQUEST_READ_CONTACTS” –

+0

对不起,我的错误,如果您更改Manifest.permission.READ_CONTACTS Manifest.permission.GET_ACCOUNTS,这解决了这个问题 – Chefes

+0

MY_PERMISSIONS_REQUEST_READ_CONTACTS是一个常量来检查是否所有很好,就像一面旗帜。这个变量是在Utilities类中建立的。 – Chefes

0

正如所讨论的,你需要添加运行权限的Android米及以上。要申请任何权限,您可以使用下面的代码并添加您需要的权限。这是你如何通过访问相关许可

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; 
} 
+0

如果我的应用程序没有活动? –