2011-09-09 12 views
14

Quiero rellenar previamente algunos de los campos en mi aplicación para ayudar al usuario cuando se suscribe para el servicio dentro de mi aplicación.Android - Obtenga UserData usando AccountManager/Nombre y apellido del propietario del teléfono

Entonces, ¿cómo obtendría el nombre y el apellido del propietario del dispositivo? Quiero usar información predeterminada vinculada a la cuenta de Google; hasta ahora tengo este:

AccountManager am = AccountManager.get(this); 
Account[] accounts = am.getAccounts(); 
for (Account account : accounts) { 
    if (account.type.compareTo("com.google") == 0) 
    { 
     String possibleEmail = account.name; 
     // how to get firstname and lastname here? 
    }    
} 

estoy dispuesto a tomar enfoques alternativos si se les sugiere - con tal de que puedo conseguir de correo electrónico, nombre y apellido del propietario.

Respuesta

23

En Ice Cream Sandwich obtener esta información es fácil, ya que Android incluye un perfil personal que representa el propietario del dispositivo - este perfil se conoce como el perfil "Yo" y se almacena en la tabla ContactsContract.Profile. Puede leer datos del perfil del usuario siempre que solicite los permisos READ_PROFILE y READ_CONTACTS en su AndroidManifest.xml.

Los campos más relevantes para usted son la columna DISPLAY_NAME de los campos Contacto y posiblemente StructuredName, como la foto de contacto del usuario que también está disponible.

Hay un tutorial de Android Code Lab que da a full example of reading a user's profile, el código de núcleo se encuentra en el ListProfileTask. He aquí un fragmento abreviada:

Cursor c = activity.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null); 
int count = c.getCount(); 
String[] columnNames = c.getColumnNames(); 
boolean b = c.moveToFirst(); 
int position = c.getPosition(); 
if (count == 1 && position == 0) { 
    for (int j = 0; j < columnNames.length; j++) { 
     String columnName = columnNames[j]; 
     String columnValue = c.getString(c.getColumnIndex(columnName))); 
     ... 
     // consume the values here 
    } 
} 
c.close(); 

No creo que hay una manera de conseguir este tipo de datos antes de API de nivel 14, por desgracia.

+1

Esto es bueno, pero no creo que haya ninguna garantía de que el perfil "Yo" está poblado. – gcl1

+2

@ gcl1 De hecho, no hay garantía y es por eso que si su perfil no está configurado, debe obtener el nombre del administrador de la cuenta. – amar

+0

Solo puedo obtener el 'account.name' que es mi correo electrónico y no el nombre y apellido. ¿Alguna idea? – Si8

1

Aquí es cómo lo hice (también desde api 14):

public class MainActivity implements LoaderManager.LoaderCallbacks<Cursor> { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getSupportLoaderManager().initLoader(0, null, this); 
} 



@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new CursorLoader(this, 
      // Retrieve data rows for the device user's 'profile' contact. 
      Uri.withAppendedPath(
        ContactsContract.Profile.CONTENT_URI, 
        ContactsContract.Contacts.Data.CONTENT_DIRECTORY), 
      ProfileQuery.PROJECTION, 

      // Select only name. 
      ContactsContract.Contacts.Data.MIMETYPE + "=?", 
      new String[]{ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}, 

      // Show primary fields first. Note that there won't be 
      // a primary fields if the user hasn't specified one. 
      ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    User user = new User(); 
    List<String> names = new ArrayList<>(); 
    cursor.moveToFirst(); 
    String mimeType; 
    while (!cursor.isAfterLast()) { 
     mimeType = cursor.getString(ProfileQuery.MIME_TYPE); 
     switch (mimeType) { 

      case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE: 
       String name = cursor.getString(ProfileQuery.GIVEN_NAME) + " " + cursor.getString(ProfileQuery.FAMILY_NAME); 
       if (!TextUtils.isEmpty(name)) { 
        names.add(name); 
       } 
       break; 
     } 
     cursor.moveToNext(); 
    } 

    if (!names.isEmpty()) { 
     // do with names whatever you want 
    } 
} 



@Override 
public void onLoaderReset(Loader<Cursor> loader) { 

} 

private interface ProfileQuery { 
    String[] PROJECTION = { 
      ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, 
      ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, 
      ContactsContract.Contacts.Data.MIMETYPE 
    }; 


    /** 
    * Column index for the family name in the profile query results 
    */ 
    int FAMILY_NAME = 0; 
    /** 
    * Column index for the given name in the profile query results 
    */ 
    int GIVEN_NAME = 1; 
    /** 
    * Column index for the MIME type in the profile query results 
    */ 
    int MIME_TYPE = 2; 
} 

Y no debe haber permisos:

<uses-permission android:name="android.permission.READ_PROFILE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
Cuestiones relacionadas