2013-12-03 3 views
8

Следующий код работает на эмуляторе, но не работает на Samsung Galaxy S III.Получить имя владельца устройства Android

final String[] projection = new String[] 
    { ContactsContract.Profile.DISPLAY_NAME }; 
    String name = null; 
    final Uri dataUri = Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); 
    final ContentResolver contentResolver = getContentResolver(); 
    final Cursor c = contentResolver.query(dataUri, projection, null, null, null); 

    try 
    { 
     if (c.moveToFirst()) 
     { 
      name = c.getString(c.getColumnIndex(ContactsContract.Profile.DISPLAY_NAME)); 
     } 
    } 
    finally 
    { 
     c.close(); 
    } 
    System.out.println(name); 

Вот исключение:

12-03 20:57:15.751: E/AndroidRuntime(28172): FATAL EXCEPTION: main 
12-03 20:57:15.751: E/AndroidRuntime(28172): java.lang.RuntimeException: Unable to start activity ComponentInfo{ht.smca.flashligh/ht.smca.flashligh.MainActivity}: java.lang.NullPointerException 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.os.Looper.loop(Looper.java:137) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.ActivityThread.main(ActivityThread.java:4898) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at java.lang.reflect.Method.invokeNative(Native Method) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at java.lang.reflect.Method.invoke(Method.java:511) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at dalvik.system.NativeStart.main(Native Method) 
12-03 20:57:15.751: E/AndroidRuntime(28172): Caused by: java.lang.NullPointerException 
12-03 20:57:15.751: E/AndroidRuntime(28172): at com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at ht.smca.flashligh.MainActivity.onCreate(MainActivity.java:68) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.Activity.performCreate(Activity.java:5206) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083) 
12-03 20:57:15.751: E/AndroidRuntime(28172): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
12-03 20:57:15.751: E/AndroidRuntime(28172): ... 11 more 

Любые предложения? Я делаю это для обучения, т. Е. Для семинара.

+0

Что такое линия 68 в MainActivity? Пожалуйста, опубликуйте его. – JoelFernandes

+0

У вас есть исключение null-указателя java, поэтому имя равно null. Поместите свой system.out.println() в попытке, и у вас не будет этой ошибки. После получения имени я действительно не знаю –

+0

Строка 68 is println. Моя цель - действительно получить имя, но я получаю нуль на реальном устройстве. Что касается эмулятора, этот код выводит держатель устройства в консоли. –

ответ

5

У вас есть исключение из java null указателя, поэтому имя равно null. Поместите файл system.out.println() в try, и у вас не будет этой ошибки. После того, как для получения имени я не знаю, - плакированного

Не мое сообщение, но ваш ответ: Get Android Device Name (для андроида модели устройства мой плохой)

android.os.Build.MODEL; 

Вот два способа сделать это:

How can I get the google username on Android?

How can I get the first name (or full name) of the user of the phone?

+0

Мне нужно знать имя держателя устройства, а не самого устройства. Цель состоит не в том, чтобы избавиться от NullPointerException, а в том, чтобы поместить в мою переменную действительно то, что я хочу иметь. –

+0

О, ой, в любом случае ваш Нуль придет от вашей инициализации, как я уже говорил. После того, как я не могу проверить его прямо сейчас, но может быть что-то вроде android.os.Build.USER; может работать –

22

Это поможет вам получить owne имя г хранится на устройстве:

Cursor c = getApplication().getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null); 
c.moveToFirst(); 
textView.setText(c.getString(c.getColumnIndex("display_name"))); 
c.close(); 

Убедитесь, что вы добавить это разрешение в манифесте:

<uses-permission android:name="android.permission.READ_CONTACTS"/> 
+0

На самом деле тот же код размещен выше. Разрешения установлены. –

+0

Это работает для меня. Если вы хотите, вы можете попробовать. – JoelFernandes

+0

Поскольку в устройстве было бы несколько учетных записей. Затем он отобразит имя первой учетной записи. В некоторых случаях это может быть не из учетной записи Google. –

2

Этот код даст владельцу полную информацию

Попробуйте этот код:

public class EmailFetcher{ 

    static String getName(Context context) { 
     Cursor CR = null; 
     CR = getOwner(context); 
     String id = "", name = ""; 
     while (CR.moveToNext()) 
     { 
      name = CR.getString(CR.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     } 
     return name; 
    } 


    static String getEmailId(Context context) { 
     Cursor CR = null; 
     CR = getOwner(context); 
     String id = "", email = ""; 
     while (CR.moveToNext()) { 
      id = CR.getString(CR.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID)); 
      email = CR.getString(CR.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
     } 
     return email; 
    } 


    static Cursor getOwner(Context context) { 
     String accountName = null; 
     Cursor emailCur = null; 
     AccountManager accountManager = AccountManager.get(context); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 
     if (accounts[0].name != null) { 
      accountName = accounts[0].name; 
      String where = ContactsContract.CommonDataKinds.Email.DATA + " = ?"; 
      ArrayList<String> what = new ArrayList<String>(); 
      what.add(accountName); 
      Log.v("Got account", "Account " + accountName); 
      for (int i = 1; i < accounts.length; i++) { 
       where += " or " + ContactsContract.CommonDataKinds.Email.DATA + " = ?"; 
       what.add(accounts[i].name); 
       Log.v("Got account", "Account " + accounts[i].name); 
      } 
      String[] whatarr = (String[])what.toArray(new String[what.size()]); 
      ContentResolver cr = context.getContentResolver(); 
      emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, where, whatarr, null); 
      if (id != null) { 
       // get the phone number 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); 
       while (pCur.moveToNext()) 
       { 
        phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        Log.v("Got contacts", "phone" + phone); 
       } 
       pCur.close(); 
      } 
     } 
     return emailCur; 
    } 
} 
3
ContentResolver cr=getContentResolver(); 
Cursor curser = cr.query(ContactsContract.Profile.CONTENT_URI, null, null, null, null); 
if(curser.getCount()>0){ 
    c.moveToFirst(); 
    String name=curser.getString(curser.getColumnIndex(
     ContactsContract.Profile.DISPLAY_NAME)); 
    Toast.makeText(MainActivity.this, "name"+name, Toast.LENGTH_SHORT).show(); 
} 
c.close(); 
+0

Это работает на большинстве устройств, которые я тестировал, но на моих друзей. Huawei P8 Lite. Я получаю это (так что убедитесь, что вы поймаете это исключение для устройств, которые ведут себя так:) android.database.CursorIndexOutOfBoundsException: запрошенный индекс 0 с размером 0 в android.database.AbstractCursor.checkPosition (AbstractCursor.java:460) в android.database.AbstractWindowedCursor.checkPosition (AbstractWindowedCursor.java:136) в android.database.AbstractWindowedCursor. getString (AbstractWindowedCursor.java:50) в android.database.CursorWrapper.getString (CursorWrapper.java:137) – Leejjon

Смежные вопросы