0

Android モバイル 4.0 から Android アプリケーションまでのすべてのレコードを保持する 1 つのアプリを作成しています。私もこれをしました。しかし問題は、電話帳にほぼ 200 の連絡先があるのに、アプリケーションでランダムに 90 レコードしか得られないことです。私はたくさん試しました。しかし、私が見つけた解決策はありません。誰でも解決できますか?以下は私のコードです:

ContentResolver cr=getContentResolver();
Cursor cur=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
if (cur.getCount() > 0) 
{
    while (cur.moveToNext()) 
    {
     String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
     String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
     if(Integer.parseInt(cur.getString 
                  (cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER )))  > 0) 
     {
       //Query phone here.  Covered next
    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                      null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new 
                      String[]{id}, null);
        while (pCur.moveToNext()) 
       {
                // Do something with phones
    String pnumber 
        =pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    contactids.add(id);
    names.add(name.trim().toLowerCase());
    PhoneNumbers.add(pnumber);
    } 
       pCur.close();
}
else
{
    String pnumber="";
    contactids.add(id);
    names.add(name);
    PhoneNumbers.add(pnumber);
}
}

最後に、次のコードを実行しました。しかし、これに関する問題は、連絡先が 1500 を超えるとレコードを取得できないことです。1500 レコードまでの処理は非常に遅くなります。

public class MyActivity extends Activity {
public Cursor cur;
public int j=0;
@Override
public void onCreate(Bundle savedInstanceState) 
{
     cur=getContacts();
    startManagingCursor(cur);
    cur.moveToFirst(); 
    Button btn=(Button)findViewById(R.id.button1);
    btn1.setOnClickListener(new OnClickListener() 
    {   
        public void onClick(View v) 
        {               
            contactids=new ArrayList<String>();
            names=new ArrayList<String>();
            PhoneNumbers=new ArrayList<String>();
            try
            {
                new showdialog1(MyActivity.this).execute();
            }
            catch (Exception e) 
        {
            // TODO: handle exception
            e.printStackTrace();
        }
        }
    });
}
class showdialog1 extends AsyncTask<Void, Void, Void>
{
    public showdialog1(Activity act) {
         super.onPreExecute();
    }   
    @Override
    protected void onPreExecute() {

        dialog = ProgressDialog.show(MyActivity.this,"title", "message");
    }

    @Override
    protected Void doInBackground(Void... params) {
        if (cur.getCount() > 0) 
        {
            do
            {
                String id = cur.getString(
                cur.getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur.getString(
                                cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                Cursor pCur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"=" +id, null, null);
                if(pCur.getCount()>0)
                {
                    while (pCur.moveToNext()) 
                        {
                        // Do something with phones
                            String pnumber=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            contactids.add(id);
                            names.add(name.trim().toLowerCase());
                            PhoneNumbers.add(pnumber);
                        } 
                        pCur.close();
            }
            else
            {
                String pnumber="";
                    contactids.add(id);
                    names.add(name.trim().toLowerCase());
                    PhoneNumbers.add(pnumber);
            }

           }while (cur.moveToNext()); 
            cur.close();
        }               
        return null;        
    }
    @Override
    protected void onPostExecute(Void result) {
        dialog.dismiss();
        int contactidsize=contactids.size();
        int namesize=contactids.size();
        int numbersize=contactids.size();
        saverecords();
        return;
    }       

}
}
4

3 に答える 3

2

電話の連絡先リストを取得します。このコードを試してから、リストから連絡先を使用する場合は、その連絡先を選択し、その連絡先の詳細を使用します(例:番号、名前、email.idなど)plz goto以下のリンク

/***  USE this CODE   ******/
int PICK_CONTACT=1;

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT);`
于 2012-10-12T11:38:30.033 に答える
1

条件を使用しています:

Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER ))) > 0)

電話番号を持たない連絡先は考慮されません。

これがうまくいくことを願っています

于 2012-08-14T13:47:17.103 に答える
-1

ContactManager を参照してくださいhttp://developer.android.com/resources/samples/ContactManager/index.html

ブール変数の作成と初期化mShowInvisible- に設定するとtrue、ユーザー設定に関係なくすべての連絡先がリストされます

/**
* Obtains the contact list for the currently selected account.
*
* @return A cursor for for accessing the contact list.
*/
private Cursor getContacts(){
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
    ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME
};
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"(mShowInvisible ? "0" : "1") + "'";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}
于 2012-08-07T06:23:05.573 に答える