【问题标题】:Get Owner Name of an Android Device获取 Android 设备的所有者名称
【发布时间】:2013-12-20 01:29:48
【问题描述】:

以下代码可在模拟器上运行,但无法在三星 Galaxy S III 上运行。

    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

有什么建议吗?我这样做是为了学习目的,即为了一个研讨会。

【问题讨论】:

  • MainActivity 中的第 68 行是什么?请张贴。
  • 您有 java 空指针异常,所以名称为空。将您的 system.out.println() 放入尝试中,您将不会出现此错误。在得到我不知道的名字之后
  • 第 68 行是 println。我的目标是真正得到这个名字,但我在真实设备上得到了空值。至于模拟器,此代码在控制台中输出设备持有人。
  • 确保您已登录手机的 Gmail 帐户。

标签: java android


【解决方案1】:

这将帮助您获取设备上存储的所有者名称:

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"/>

【讨论】:

  • 其实和上面贴的代码是一样的。权限已设置。
  • 既然这样,设备中就会有多个账户。然后它将给出第一个帐户的显示名称。在某些情况下,这可能不是 Google 的帐户。
  • 应用程序请求读取所有联系人的权限是可疑的。仅读取所有者的姓名不一定需要此权限。
  • 我不认为 android.permission.READ_PROFILE 是合法的权限。至少它不在 Android 25 API 的 MANIFEST 类中。只要您拥有 READ_CONTACTS 权限,此调用就可以在没有它的情况下工作。
【解决方案2】:

您有 java 空指针异常,因此名称为空。将您的 system.out.println() 放入尝试中,您将不会出现此错误。在得到我不知道的名字之后——Clad

不是我的帖子,而是您的回答: 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?

【讨论】:

  • 我需要知道设备持有者的名称,而不是设备本身的名称。目标不是摆脱 NullPointerException,而是将我想要的变量放入我的变量中。
  • 哦,好吧,你的 Null 来自你的初始化,就像我告诉你的那样。在我现在无法真正测试它但可能像 android.os.Build.USER;可以工作
【解决方案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();

【讨论】:

  • 这适用于我测试过的大多数设备,但在我的朋友华为 P8 Lite 上我得到了这个(所以请确保你捕捉到这种行为的设备的异常):android.database.CursorIndexOutOfBoundsException :请求索引 0,在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor .java:50) 在 android.database.CursorWrapper.getString(CursorWrapper.java:137)
【解决方案4】:

此代码将为所有者提供完整信息

试试这个代码:

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

【讨论】:

    【解决方案5】:
    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();
    

    使用上述代码从 android 设备获取所有者名称。这基本上为我的用户获取存储在联系人中的名称。

    注意:少数用户会出现如下异常

    android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460) at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) at android.database.CursorWrapper.getString(CursorWrapper.java:137)
    

    此异常并非特定于手机或特定于用户。有些用户没有在联系人列表中设置自己的联系人。因此,为了解决这个问题,启动应用程序的用户需要在联系人应用程序中设置第一行,即 ME 联系人。只需在个人信息中输入您的姓名即可生成卡片。

    @Leejjon ^^

    【讨论】:

    • 请更新您的答案。您在开始时使用变量名称“cr”(ContentResolver cr),但在开始时使用“c”(c.close())。这就是为什么这会在 android studio 中显示错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多