私はこれについて正解を見つけることができませんでした。Androidアプリで携帯電話の所有者の連絡先情報を取得できるかどうか誰かに教えてもらえますか?
5 に答える
私は非常に簡単な方法を見つけました(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)
そして.....これで完了です。
したがって、答えは技術的にはノーです。所有者のデータを取得するためにこれまでに見つけた唯一の方法は、アカウントマネージャーを使用することです。使用方法の例を次に示します。
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を参照してください。
私たちがしなければならないこと:
1)ユーザー同期アカウント名(通常はGoogleメール)を
取得します2)このメールで連絡先帳から連絡先を取得します
3)この連絡先から連絡先データを取得します
完璧に近いわけではなく、2つの追加の権限が必要ですが、少なくとも機能します。
ここにコードがあります、可能なコード更新はここにあります: https ://gist.github.com/3904299
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()