我在这个问题上一直没有找到一个明确的答案。有人能告诉我在Android应用程序中是否可以获取手机所有者的联系信息吗?
我在这个问题上一直没有找到一个明确的答案。有人能告诉我在Android应用程序中是否可以获取手机所有者的联系信息吗?
我找到了一种非常简单的方法(从研究 4.1 版的消息应用程序中获得!)
游标的投影是:
final String[] SELF_PROJECTION = new String[] { Phone._ID,Phone.DISPLAY_NAME, };
光标是:
Cursor cursor = activity.getContentResolver().query(Profile.CONTENT_URI, SELF_PROJECTION, null, null, null);
现在只需简单操作即可
cursor.moveToFirst():
然后通过以下方式获取联系人id
cursor.getString(0)
通过此方式获取联系人姓名
cursor.getString(1)
然后......你就完成了!
android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH
中。有足够多的搜索查询会聚焦于这个响应,我们应该为未来推广它! - Kenton PriceAndroidManifest.xml
中添加<uses-permission android:name="android.permission.READ_PROFILE" />
,则可能会遇到SecurityException
异常。 - declension所以从技术上讲答案是否定的。目前我发现获取所有者数据的唯一方式是通过账户管理器。以下是如何使用它的示例:
final AccountManager manager = AccountManager.get(this);
final Account[] accounts = manager.getAccountsByType("com.google");
final int size = accounts.length;
String[] names = new String[size];
for (int i = 0; i < size; i++) {
names[i] = accounts[i].name;
}
更多信息请参见:http://code.google.com/p/google-api-java-client/wiki/AndroidAccountManager
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;
public class OwnerInfo {
// this class allows to get device information. It's done in two steps:
// 1) get synchronization account email
// 2) get contact data, associated with this email
// by https://github.com/jehy
//WARNING! You need to have permissions
//
//<uses-permission android:name="android.permission.READ_CONTACTS" />
//<uses-permission android:name="android.permission.GET_ACCOUNTS" />
//
// in your AndroidManifest.xml for this code.
public String id = null;
public String email = null;
public String phone = null;
public String accountName = null;
public String name = null;
public OwnerInfo(Activity MainActivity) {
final AccountManager manager = AccountManager.get(MainActivity);
final Account[] accounts = manager.getAccountsByType("com.google");
if (accounts[0].name != null) {
accountName = accounts[0].name;
ContentResolver cr = MainActivity.getContentResolver();
Cursor emailCur = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Email.DATA + " = ?",
new String[] { accountName }, null);
while (emailCur.moveToNext()) {
id = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
email = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
String newName = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (name == null || newName.length() > name.length())
name = newName;
Log.v("Got contacts", "ID " + id + " Email : " + email
+ " Name : " + name);
}
emailCur.close();
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();
}
}
}
}
对于冰激凌三明治或更高版本,可以使用
String[] columnNames = new String[] {Profile.DISPLAY_NAME, Profile.PHOTO_ID};
Cursor c = activity.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, columnNames, null, null, null);
int count = c.getCount();
boolean b = c.moveToFirst();
int position = c.getPosition();
if (count == 1 && position == 0) {
for (int j = 0; j < columnNames.length; j++) {
String name = c.getString(0));
long photoId = c.getLong(1));
}
}
c.close();
从API 23及以上版本,您需要在清单文件中添加适当的权限。
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
String[] columnNames = new String[] {ContactsContract.Profile.DISPLAY_NAME, ContactsContract.Profile.PHOTO_ID};
Cursor c = activity.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, columnNames, null, null, null);
int count = c.getCount();
boolean b = c.moveToFirst();
int position = c.getPosition();
if (count == 1 && position == 0) {
for (int j = 0; j < count; j++) {
String name = c.getString(c.getColumnIndex(ContactsContract.Profile.DISPLAY_NAME));
String photoID = c.getString(c.getColumnIndex(ContactsContract.Profile.PHOTO_ID));
Log.i("MainActivity", "name: " + name);
Log.i("MainActivity", "photoID: "+ photoID);
}
}
c.close()