Java 获取 Android 设备的所有者名称
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20360506/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get Owner Name of an Android Device
提问by Danny Lo
The following code works on an emulator, but fails to run on Samsung Galaxy S III.
以下代码适用于模拟器,但无法在 Samsung 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);
Here is the exception:
这是例外:
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.access0(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
Any Suggestions? I do this for learning purposes, i.e. for a seminar.
有什么建议?我这样做是为了学习目的,即为了一个研讨会。
采纳答案by Clad Clad
You have java null pointer exception so name is null. Put your system.out.println() in the try and you won't have this error. After for getting the name I don't really know – Clad
您有 java 空指针异常,因此名称为空。将您的 system.out.println() 放入 try 中,您将不会出现此错误。在得到这个名字之后我真的不知道 – Clad
Not my post but your answer : Get Android Device Name(for android device model my bad)
不是我的帖子,而是你的答案: 获取 Android 设备名称(对于 android 设备型号我不好)
android.os.Build.MODEL;
Here are two ways to do it :
这里有两种方法:
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?
回答by Joel Fernandes
This will help you get the owner name stored on the device:
这将帮助您获取存储在设备上的所有者名称:
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();
Make sure you add this permission in the manifest:
确保在清单中添加此权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
回答by Sanjit Majee
This code will give owner full information
此代码将为所有者提供完整信息
Try this code:
试试这个代码:
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;
}
}
回答by Vishnu Singh
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();
回答by Prateek Alakh
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();
Use the above code for fetching owners name from android device. This basically fetches the name stored in contacts for me user.
使用上面的代码从 android 设备获取所有者名称。这基本上为我的用户获取存储在联系人中的名称。
Note : There will be an exception like the below for few users
注意:少数用户会出现如下异常
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)
This exception is not phone specific or user specific. Some users do not set their own contact in the contact list. So for resolving this the user on which the app is started needs to setup in Contacts application the first line that is ME contact. Just enter your name in personal info and card will be generated.
此例外不是特定于电话或特定于用户的。有些用户没有在联系人列表中设置自己的联系人。因此,为了解决这个问题,启动应用程序的用户需要在联系人应用程序中设置第一行是 ME 联系人。只需在个人信息中输入您的姓名,就会生成卡片。
@Leejjon ^^
@Leejjon ^^