状況: this questionとrelated sample app on GitHubの手順に従って、Androidの連絡先にカスタムアクションを追加しました。私のアプリケーションでその連絡先にダイヤルしたいと思う。カスタムアクションが押されたときに開かれたアクティビティ内の連絡先を正常に取得できました。Androidのネイティブ連絡先アプリでカスタムフィールドをクリックして連絡先の電話番号を取得するにはどうすればよいですか?
私はこれを実行します。
Cursor cursor = context.getContentResolver().query(data, null, null, null, null);
if (cursor != null) {
newIntent = true;
contact = LocalContactAsync.getContacts(cursor, context.getContentResolver()).get(0);
cursor.close();
}
そして私は、Androidから取得data
がある:
内容://com.android.contacts/data/2849
お知らせ最後の番号2849、これは連絡先のネイティブIDではありません。連絡先のネイティブIDは459
です。私は正常にこのクエリを実行する連絡先を取得することができる午前、以下のデータを返します:
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID);
-returns '2849'
cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) ;
-returns 'サンプルsamplee' ウィッヒは正しい
ですがこれは真ですが、
cursor.getInt(cur.getColumnIndex(
ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0)
次の関数は、空のカーソルを返します。
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id}, null);
この場合、-id = 2849
が、私は459で埋める場合、それは3つの数字を返す必要がありますので、私は電話番号
実際の接触は3つの数字を持っているの適切な量を取得します。
これをどのように修正できますか?私は正しい名前を取得しますが、連絡先は数字を持っていながら、次のクエリは、null
を返します。
編集:私は、番号を検索明確にする方法を
です。
ArrayList<Number> numbers = new ArrayList<>();
if (cur.getInt(cur.getColumnIndex(
ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id}, null);
while (pCur.moveToNext()) {
numbers.add(new nl.coffeeit.clearvoxnexxt.objects.dto.Number(pCur.getString(pCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER))));
}
pCur.close();
}
return numbers;
ViberのとのWhatsAppが行うように私は、ネイティブの連絡先に追加されたカスタムアクションを通してそれを受け、私は意図を要求しないことに注意してください:
完全なコードをLocalContacts非同期:
private static final String TAG = "LocalContactAsync";
private static List<Contact> contacts;
private Context context;
private boolean refreshOtherFragments;
private boolean renew;
private synchronized List<Contact> getContacts(Context context) {
if (!renew && contacts != null) {
return contacts;
}
ContentResolver cr = context.getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
if (cur != null && cur.getCount() > 0) {
contacts = getContacts(cur, cr);
cur.close();
return contacts;
}
if (cur != null) {
cur.close();
}
return new ArrayList<>();
}
public static List<Contact> getContacts(Cursor cur, ContentResolver cr) {
List<Contact> contacts = new ArrayList<>();
while (cur.moveToNext()) {
String id = getId(cur);
String name = getName(cur);
ArrayList<Number> numbers = getNumbers(cur, cr, id);
if (name != null) {
contacts.add(new Contact(id, name, numbers));
}
}
Log.d(TAG, "amount of contacts" + contacts.size());
return contacts;
}
private static ArrayList<Number> getNumbers(Cursor cur, ContentResolver cr, String id) {
ArrayList<Number> numbers = new ArrayList<>();
if (cur.getInt(cur.getColumnIndex(
ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id}, null);
while (pCur.moveToNext()) {
numbers.add(getNumber(pCur));
}
pCur.close();
}
return numbers;
}
private static Number getNumber(Cursor pCur) {
return new nl.coffeeit.clearvoxnexxt.objects.dto.Number(pCur.getString(pCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
private static String getId(Cursor cur) {
return cur.getString(
cur.getColumnIndex(ContactsContract.Contacts._ID));
}
private static String getName(Cursor cur) {
return cur.getString(cur.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
}
コード番号のためのDTO:
public class Number implements Parcelable, Serializable {
@SerializedName("number")
@Expose
public String number;
@SerializedName("type")
@Expose
public String type = "";
@SerializedName("inherited")
@Expose
public Boolean inherited = false;
public Number(String number) {
this.number = number;
}
protected Number(Parcel in) {
number = in.readString();
type = in.readString();
byte inheritedVal = in.readByte();
inherited = inheritedVal == 0x02 ? null : inheritedVal != 0x00;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(number);
dest.writeString(type);
if (inherited == null) {
dest.writeByte((byte) (0x02));
} else {
dest.writeByte((byte) (inherited ? 0x01 : 0x00));
}
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Number> CREATOR = new Parcelable.Creator<Number>() {
@Override
public Number createFromParcel(Parcel in) {
return new Number(in);
}
@Override
public Number[] newArray(int size) {
return new Number[size];
}
};
public Number setNumber(String number) {
this.number = number;
return this;
}
}
情報ありがとうございますが、私は結果のための活動を開始しません。ネイティブの連絡先にカスタムイベントを追加して、Androidの連絡先アプリケーションから直接アプリを開きます。それらのエクストラをどのように管理しますか? – jobbert
質問に追加情報を追加しました。あなたが提供したコードは私と同じように働いていました。私は名前とIDを取得しますが、電話番号は取得しません。連絡先には3つの電話番号があります。また、私はすべての連絡先を取得する場合、私は電話番号を取得することができます。 – jobbert
次に、番号2849が返されます。それは悪い命名です。それはまったく非同期ではありません。あなたが望むなら私はフルコードを投稿することができます。 – jobbert