2016-12-20 9 views
1

状況: this questionrelated 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が行うように私は、ネイティブの連絡先に追加されたカスタムアクションを通してそれを受け、私は意図を要求しないことに注意してください:

custom action android contact

完全なコードを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; 
    } 
} 

答えて

1

注意すべき最初の事は、連絡先への呼び出しは次のようにピッカということです:最後のパス(3163rに

content://com.android.contacts/contacts/lookup/3163r328-4D2941473F314D2941473F3131/328 

二..:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 

は次のようにURIを返します。 ..)は検索キーで、328はNAME_RAW_IDです。

sample applicationから得たインテントとこれを比較してください。

content://com.android.contacts/data/2849 

あなたは、このURIを持つコンテンツのリゾルバを呼び出すと、連絡先の名前を取得するために使用することができるが、電話番号を取得するのに十分ではないと述べてきたようにと:これは、このようになりますウリが含まれていますid。そこで、不完全なIntent Uriを使用して、電話番号を取得するために使用できる新しいLookup Uriを構築します。

のは(私はあなたがこれまでに行っているものをリファクタリングしません、私はちょうどあなたが使用しているスタイルに追加します)あなたのLocalContactAsyncに次のメソッドを追加してみましょう:

public static Uri getLookupUri(Cursor cur) { 
    return getContentUri(getLookupKey(cur), getNameRawId(cur)); 
} 

private static String getLookupKey(Cursor cur) { 
    return cur.getString(
      cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); 
} 

private static String getNameRawId(Cursor cur) { 
    return cur.getString(cur.getColumnIndex(ContactsContract.Contacts.NAME_RAW_CONTACT_ID)); 
} 

private static Uri getContentUri(String lookupKey, String nameRawId) { 
    return new Uri.Builder() 
      .scheme("content") 
      .authority("com.android.contacts") 
      .appendPath("contacts") 
      .appendPath("lookup") 
      .appendPath(lookupKey) 
      .appendPath(nameRawId) 
      .build(); 
} 

はの内部ViewingActivityを変更してみましょうサンプルアプリケーションは実際に連絡先の詳細を取得します。必要に応じて

@Override 
protected void onResume() { 
    super.onResume(); 
    Uri uri = getIntent().getData(); 
    Cursor intentCursor = this.getContentResolver().query(uri, null, null, null, null); 
    Contact contact = null; 
    if (intentCursor != null) { 
     intentCursor.moveToFirst(); 
     Uri lookupUri = LocalContactAsync.getLookupUri(intentCursor); 
     Cursor lookupCursor = this.getContentResolver().query(lookupUri, null, null, null, null); 
     contact = LocalContactAsync.getContacts(lookupCursor, this.getContentResolver()).get(0); 
     intentCursor.close(); 
     lookupCursor.close(); 
    } 
} 

接触が今の電話番号が含まれています:私たちは今、onResume()内側に次のコードを使用していることを行うことができます。

+0

情報ありがとうございますが、私は結果のための活動を開始しません。ネイティブの連絡先にカスタムイベントを追加して、Androidの連絡先アプリケーションから直接アプリを開きます。それらのエクストラをどのように管理しますか? – jobbert

+0

質問に追加情報を追加しました。あなたが提供したコードは私と同じように働いていました。私は名前とIDを取得しますが、電話番号は取得しません。連絡先には3つの電話番号があります。また、私はすべての連絡先を取得する場合、私は電話番号を取得することができます。 – jobbert

+0

次に、番号2849が返されます。それは悪い命名です。それはまったく非同期ではありません。あなたが望むなら私はフルコードを投稿することができます。 – jobbert

関連する問題