2011-07-14 17 views
2

私はアプリを作成しました。 htc desire hdに取り組んでいますが、ZTE Bladeでテストしたところ、奇妙な問題が発生しました。私のアプリでは、ユーザーがスピナーから連絡先名を選択すると、メニューが表示されます。メニューでは、ユーザーにSMSを送信したり、電話をかけたり、連絡先情報を見ることができます。 HTC Desire HDでは、すべて正常に動作しています。 ZTEでは、連絡先情報ボタンに厄介な問題があるようです。ユーザーが連絡先を選択して連絡先情報を表示することがある特定のケースでは、他の連絡先の情報が表示されます。だから私はスピナーからピートを選んだが、デイブの連絡先情報を得る。他のケースでは、私はスピナーからトムを選択し、トムの連絡先情報を取得します。この問題は私のHTCには存在しません。私は問題の原因を突き止めることができませんでした。ちなみに、HTCの私の連絡先リストには、GmailやFacebookからも入力されていますが、ZTEの連絡先リストにGmailやFacebookのアカウントは見られませんでした(私はこれについて完全にはわかりません)。Android:連絡先の読み込みに関する奇妙なこと

  infobtn.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       ContentResolver cr = getContentResolver(); 
       Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

       if (cur.getCount() > 0) 
       { 

        while (cur.moveToNext()) { 
        id_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
        name_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
         if (name_contact.equals(name1)) 
         { 
         Cursor pCur = cr.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id_contact}, null); 
          id_contact2 = id_contact; 

          while (pCur.moveToNext()){ 
          } 
         pCur.close(); 
         } 
        } 
        Intent intent_contacts = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/" + id_contact2)); 
        startActivity(intent_contacts); 
       } 

      } 
     }); 
+0

ないものを使用して取得しますか?私はXperia 10でもこれを体験しました。 – erdomester

+0

私は考えていました...もしこれが輸入された連絡先に起因するのであれば?私の電話には連絡先がありません。だから私は問題に遭遇しないが、他のすべての電話では、連絡先はSymbianからインポートされた。多分、これは連絡先ID-sを駄目にするかもしれません。例えば。私の同僚は、インポートされた連絡先を分離することはできません:彼の電話でチャールズディケンズ、それはちょうどチャールズディケンズです。ファーストネーム、姓、単に名前ではありません。どう思いますか? – erdomester

+0

あなたはこのバグの解決策を見つけることができましたか? –

答えて

0

私は自分のアプリケーションで同様の問題を抱えている:

これは私が連絡先情報を取得するために使用していたコードです。このアプリはお気に入りの連絡先をすばやく使用できるウィジェットです。ユーザーは新しいウィジェットを作成し、そのウィジェットに連絡先を割り当てます。彼はウィジェットをクリックすると、電話、SMS、編集などの共通の連絡先を作成することができます。

「私は約4件の連絡先を選択していますが、それらの権利3他は私が選んでいない同じ接触です "。 「私のドロイドで信じられないほどの連絡先が表示されるのはなぜですか?

私の側では問題を再現できません。私はいくつかの異なるデバイスを試して、インポート/エクスポートの連絡先を作成しようとしました - 結果はありません。

とにかく、私は問題の原因に関するいくつかのアイデアを持っています。

私のアプリケーションは、連絡先を格納するために検索キーを使用します。according to sdkしたがって、ユーザーが連絡先をピックアップすると、アプリケーションに連絡先検索キーが保存されます。次に、この参照キーを使用してこの連絡先の連絡先IDを取得します。その後、他のすべての機能で受信した連絡先IDのみを使用します。それであなたの機能は - サブクエリで連絡先IDだけを使用します。

問題は次のとおりです。異なる連絡先(異なる検索キーを使用)が同じ連絡先IDを持つ可能性はありますか?まれに、一部のデバイスで可能性があるようです... もしそうなら、接触ID +ルックアップキーを常に一緒に使用して連絡先を識別する必要があります。 更新:提案が間違っています。連絡先の変更後にルックアップキーを変更することができます。

私が理解しているように、あなたはあなたの側で問題を再現することができます。このようにコードを変更することをお勧めします。

 infobtn.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      ContentResolver cr = getContentResolver(); 
      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

      if (cur.getCount() > 0) 
      { 

       while (cur.moveToNext()) { 
       id_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
       name_contact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       String lookup_key = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); 
        if (name_contact.equals(name1)) 
        { 
        Cursor pCur = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ? AND " + ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY + " = ?", new String[]{id_contact, lookup_key}, null); 
         id_contact2 = id_contact; 

         while (pCur.moveToNext()){ 
         } 
        pCur.close(); 
        } 
       } 
       Intent intent_contacts = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/" + id_contact2)); 
       startActivity(intent_contacts); 
      } 

     } 
    }); 

この問題を再現してみてください。あなたはこのリンクを見ることができます

+0

申し訳ありませんが、私の提案は間違っていました。この方法でlookup_keyで連絡先を検索するのは間違いです。連絡先の変更後に検索キーを変更できるためです。 – dvpublic

+0

私はこの問題の原因を発見しました。まれに、デバイスによってはルックアップキーが一意ではありません。私が自分のアプリのユーザーから入手したログファイルの部分を見てみましょう: k = 1957i5 c = 153; k = 1957i46d39cd0743de699c = 154; k = 1957i327657105acc3975c = 155; k = 1957i5 c = 394; k = 1957i300808f8df4189b1 c = 156; k = 1957i5 c = 158; k = 1957i660d8a742c21a4a6c = 411;ここで: "k"は検索キーの値、 "c"はcontactIです。したがって、接触の参照として検索IDを使用するだけでは不十分です。ペア "contactId - lookupKey"を格納する必要があります。 – dvpublic

0

、それはとても良いことだ:http://www.vtutorials.info/2014/08/working-with-android-contacts-how-to.html

private Map<Long, ArrayList<LocalContactInfo>> queryAllPhones(ContentResolver contentresolver) 
    { 
    HashMap<Long, ArrayList<LocalContactInfo>> hashmap = new HashMap<Long, ArrayList<LocalContactInfo>>(); 
    Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
      String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; 
      String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; 
    Cursor cursor = contentresolver.query(PhoneCONTENT_URI, null, null, null, null); 
    do 
    { 
     if (!cursor.moveToNext()) 
     { 
     cursor.close(); 
     return hashmap; 
     } 
     long l = cursor.getLong(cursor.getColumnIndex(Phone_CONTACT_ID)); 
     String s = cursor.getString(cursor.getColumnIndex(NUMBER)); 
     LocalContactInfo temp = new LocalContactInfo(String.valueOf(l), "", s, "", 1); 
     if (hashmap.containsKey(Long.valueOf(l))){ 
     ((List<LocalContactInfo>)hashmap.get(Long.valueOf(l))).add(temp); 
     } else{ 
     ArrayList<LocalContactInfo> arraylist = new ArrayList<LocalContactInfo>(); 
     arraylist.add(temp); 
     hashmap.put(Long.valueOf(l), arraylist); 
     } 
    } while (true); 
    } 

そして:ではなく "連絡先/人/ XXX" を使用しての

public List<LocalContactInfo> doloadContacts() { 
      List<LocalContactInfo> _return = new ArrayList<LocalContactInfo>(); 
      Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI; 
      String _ID = ContactsContract.Contacts._ID; 
      String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; 
      String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; 
      ContentResolver contentResolver = mContext.getContentResolver(); 
      Map<Long, ArrayList<LocalContactInfo>> map = queryAllPhones(contentResolver); 
      Cursor cursor = contentResolver.query(CONTENT_URI, null,null, null, null); 
      if(cursor == null || cursor.getCount()==0){ 
      return _return; 
     } 
      if (cursor.getCount() > 0) { 
       while (cursor.moveToNext()) { 
        Long contact_id = cursor.getLong(cursor.getColumnIndex(_ID)); 
        String fullname = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME)).trim(); 
        int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(HAS_PHONE_NUMBER))); 
        if (hasPhoneNumber > 0 && map.get(contact_id) != null){ 
           Object obj = ((List<LocalContactInfo>)map.get(contact_id)).get(0); 
           if(obj instanceof LocalContactInfo){ 
            LocalContactInfo _temp = (LocalContactInfo)obj; 
            _return.add(new LocalContactInfo(String.valueOf(contact_id), fullname, _temp.getNumberPhone(), "",hasPhoneNumber)); 
           } 
        } 
      } 
      } 
    return _return; 
     } 
0

、contactsContract.Contacts.CONTENT_URIを使用してみてください。

を基本的に置き換えてください。

Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, 
    id_contact2); 

Uri contactUri = Uri.parse("content://contacts/people/" + id_contact2)); 

注意すべきもう一つは、あなたが(Googleの同期は、連絡先をマージするときのように)それを使用する前に、同期が発生した場合、「id_contact2」は変更されることがあります。これを防ぐには、代わりにLookupKeyを使用する方がよいでしょう。

ContactsContract.Contacts.LOOKUP_KEY 

Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, 
    yourContactLookupKey); 
関連する問題