What is the criteria that Android depends on to join contacts from different accounts? I'm synchronizing my contacts from many accounts (Hotmail, Facebook, Gmail), everything have worked well and the OS has joined (or shows them as one) the accounts that refer to the same person. But not all accounts, since some accounts have not been joined although both accounts have the same name and one email exists in both as well.

I wonder what is the criteria that Android depends on to join the accounts?

Note: I do know that I can join them by myself in the contants list, but I would let it know them by itself.
Raw contacts are joined according to rules described at Using the Contacts API:


  Two raw contacts are considered to be a match if at least one of these
  conditions is met:
  
  
  They have matching names.
  Their names consist of the same words but in different order (for example, "Bob Parr" and "Parr, Bob")
  One of them has a common short name for the other (for example, "Bob Parr" and "Robert Parr") One of them has just a first or last name and it matches the other raw contact. This rule is less reliable, so it only applies if the two raw contacts are also sharing some other data like a phone number, an email address or a nickname (for example, Helen ["elastigirl"] = Helen Parr ["elastigirl"])
  At least one of the two raw contacts is missing the name altogether and they are sharing a phone number, an email address or a nickname (for example, Bob Parr> [incredible@android.com] = incredible@android.com).
  
  
  When comparing
  names, the system ignores upper/lower case differences (Bob=BOB=bob)
  and diacritical marks (Hélène=Helene). When comparing two phone
  numbers the system ignores special characters such as "*", "#", "(",
  ")", and whitespace. Also if the only difference between two numbers
  is that one has a country code and the other does not, then the system
  considers those to be a match (except for numbers in the Japan country
  code).
  
  Automatic aggregation is not permanent; any change of a constituent
  raw contact may create a new aggregate or break up an existing one.


There is also explicit aggregation, that can be set for raw contacts, if a user explicitly wants two contacts to be joined. Read more about it in the article.