Android获取频繁联系人列表

Android获取频繁联系人列表,android,contacts,Android,Contacts,我正试图得到一份经常被打电话的名单。 内容_streequent _URI经常给你加星星,我只想经常给你。 知道我为什么会出错吗 代码: String selection = Contacts.STARRED + "=?"; String[] selectionArgs = new String[1]; selectionArgs[0] = "0"; Cursor c = this.getContentResolver (). query (Contacts.C

我正试图得到一份经常被打电话的名单。 内容_streequent _URI经常给你加星星,我只想经常给你。 知道我为什么会出错吗

代码:

    String selection = Contacts.STARRED + "=?";
    String[] selectionArgs = new String[1];
    selectionArgs[0] = "0";
    Cursor  c = this.getContentResolver (). query (Contacts.CONTENT_STREQUENT_URI,
            null, selection, selectionArgs,null);   
    if (c != null) {
        c.moveToFirst();
        do {
                System.out.println(" " + c);

        }while (c.moveToNext());
    }
CatLog:

11-12 10:13:36.615: E/AndroidRuntime(25592): FATAL EXCEPTION: main
11-12 10:13:36.615: E/AndroidRuntime(25592): Process: com.hanstiger.android.pric, PID: 25592
11-12 10:13:36.615: E/AndroidRuntime(25592): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hanstiger.android.pric/com.hanstiger.android.pric.setting.Setting}: java.lang.IllegalArgumentException: Cannot bind argument at index 2 because the index is out of range.  The statement has 1 parameters.
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2283)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.ActivityThread.access$800(ActivityThread.java:144)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.os.Handler.dispatchMessage(Handler.java:102)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.os.Looper.loop(Looper.java:136)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.ActivityThread.main(ActivityThread.java:5153)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at java.lang.reflect.Method.invokeNative(Native Method)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at java.lang.reflect.Method.invoke(Method.java:515)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at dalvik.system.NativeStart.main(Native Method)
11-12 10:13:36.615: E/AndroidRuntime(25592): Caused by: java.lang.IllegalArgumentException: Cannot bind argument at index 2 because the index is out of range.  The statement has 1 parameters.
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.content.ContentProviderProxy.query(ContentProviderNative.java:420)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.content.ContentResolver.query(ContentResolver.java:461)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.content.ContentResolver.query(ContentResolver.java:404)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at com.hanstiger.android.pric.setting.Setting.onCreate(Setting.java:62)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.Activity.performCreate(Activity.java:5322)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-12 10:13:36.615: E/AndroidRuntime(25592):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2181)

步骤1:创建活动

public class MainActivity extends Activity {

ListView outputText;
List<String> userName;
Map<String, String> userNamePhno;
Map<String, String> userNameEmail;
StringBuffer output;
CustomAdapter adapter;
Dialog dialogDetails;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    outputText = (ListView) findViewById(R.id.listview);

    userNameEmail = new HashMap<String, String>();
    userNamePhno = new HashMap<String, String>();
    userName = new ArrayList<String>();

    new getContacts().execute();
    outputText.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {

            String[] details = new String[] { userName.get(arg2),
                    userNamePhno.get(userName.get(arg2)),
                    userNameEmail.get(userName.get(arg2)) };
            dialogDetails = new Dialog(MainActivity.this);
            dialogDetails.setContentView(R.layout.contact_details);
            dialogDetails.setTitle("Details");
            dialogDetails.show();

            TextView tvName = (TextView) dialogDetails.findViewById(R.id.name);
            TextView tvNumber = (TextView) dialogDetails.findViewById(R.id.phno);
            TextView tvEmail = (TextView) dialogDetails.findViewById(R.id.email);
            if (details[1]==null) 
            {
                tvName.setText(details[0]);
                tvNumber.setText("-");
                tvEmail.setText(details[2]);
            }
            else if (details[2]==null) 
            {
                tvName.setText(details[0]);
                tvNumber.setText(details[1]);
                tvEmail.setText("-");
            } 
            else if (details[2]==null && details[1]==null) 
            {

                tvName.setText(details[0]);
                tvNumber.setText("-");
                tvEmail.setText("-");
            } 
            else 
            {
                tvName.setText(details[0]);
                tvNumber.setText(details[1]);
                tvEmail.setText(details[2]);
            }

        }
    });

}

public class getContacts extends AsyncTask<Void, Void, Void> {
    ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setCancelable(false);
        dialog.setMessage("Wait please");
        dialog.show();

    }

    @Override
    protected Void doInBackground(Void... params) {
        fetchContacts();

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        dialog.dismiss();
        dialog.setCancelable(true);
        adapter = new CustomAdapter(MainActivity.this, userName,
                userNamePhno);
        outputText.setAdapter(adapter);
    }
}

private void fetchContacts() {
    String phoneNumber = null;
    String email = null;

    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;

    Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
    String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;

    Uri EmailCONTENT_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
    String EmailCONTACT_ID = ContactsContract.CommonDataKinds.Email.CONTACT_ID;
    String DATA = ContactsContract.CommonDataKinds.Email.DATA;

    output = new StringBuffer();

    ContentResolver contentResolver = getContentResolver();

    Cursor cursor = contentResolver.query(CONTENT_URI, null, null, null,
            null);

    if (cursor.getCount() > 0) {

        while (cursor.moveToNext()) {

            String contact_id = cursor
                    .getString(cursor.getColumnIndex(_ID));
            String name = cursor.getString(cursor
                    .getColumnIndex(DISPLAY_NAME));

            int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor
                    .getColumnIndex(HAS_PHONE_NUMBER)));

            if (hasPhoneNumber > 0) {
                output.append("\n First Name:" + name);
                userName.add(name);

                // Query and loop for every phone number of the contact
                Cursor phoneCursor = contentResolver.query(
                        PhoneCONTENT_URI, null, Phone_CONTACT_ID + " = ?",
                        new String[] { contact_id }, null);

                while (phoneCursor.moveToNext()) {

                    phoneNumber = phoneCursor.getString(phoneCursor
                            .getColumnIndex(NUMBER));
                    output.append("\n Phone number:" + phoneNumber);
                    // userPhoneNumber.add(phoneNumber);
                    userNamePhno.put(name, phoneNumber);

                }
                phoneCursor.close();

                // Query and loop for every email of the contact
                Cursor emailCursor = contentResolver.query(
                        EmailCONTENT_URI, null, EmailCONTACT_ID + " = ?",
                        new String[] { contact_id }, null);
                while (emailCursor.moveToNext()) {

                    email = emailCursor.getString(emailCursor
                            .getColumnIndex(DATA));
                    output.append("\nEmail:" + email);
                    // userEmailAddress.add(email);
                    userNameEmail.put(name, email);

                }
                emailCursor.close();

            }
            output.append("\n");

        }
        // outputText.setText(output);

    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}
公共类MainActivity扩展活动{
ListView输出文本;
列出用户名;
映射userNamePhno;
地图用户名电子邮件;
字符串缓冲输出;
自定义适配器;
对话详情;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
outputText=(ListView)findViewById(R.id.ListView);
usernamemail=newhashmap();
userNamePhno=newhashmap();
userName=newarraylist();
新建getContacts().execute();
outputText.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
字符串[]详细信息=新字符串[]{userName.get(arg2),
userNamePhno.get(userName.get(arg2)),
usernamemail.get(userName.get(arg2))};
dialogDetails=新建对话框(MainActivity.this);
dialogDetails.setContentView(R.layout.contact_详细信息);
dialogDetails.setTitle(“详细信息”);
dialogDetails.show();
TextView tvName=(TextView)dialogDetails.findViewById(R.id.name);
TextView tvNumber=(TextView)dialogDetails.findViewById(R.id.phno);
TextView tvEmail=(TextView)dialogDetails.findviewbyd(R.id.email);
如果(详细信息[1]==null)
{
tvName.setText(详细信息[0]);
tvNumber.setText(“-”);
tvEmail.setText(详情[2]);
}
else if(详细信息[2]==null)
{
tvName.setText(详细信息[0]);
tvNumber.setText(详细信息[1]);
tvEmail.setText(“-”);
} 
else if(详细信息[2]==null&&details[1]==null)
{
tvName.setText(详细信息[0]);
tvNumber.setText(“-”);
tvEmail.setText(“-”);
} 
其他的
{
tvName.setText(详细信息[0]);
tvNumber.setText(详细信息[1]);
tvEmail.setText(详情[2]);
}
}
});
}
公共类getContacts扩展异步任务{
进程对话;
@凌驾
受保护的void onPreExecute(){
dialog=新建ProgressDialog(MainActivity.this);
对话框。可设置可取消(false);
setMessage(“请稍候”);
dialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数){
fetchContacts();
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
dialog.dismise();
对话框。可设置可取消(true);
adapter=新的CustomAdapter(MainActivity.this,用户名,
userNamePhno);
outputText.setAdapter(适配器);
}
}
私有联系人(){
字符串phoneNumber=null;
字符串email=null;
Uri CONTENT\u Uri=Contacts contract.Contacts.CONTENT\u Uri;
String _ID=Contacts contact.Contacts.\u ID;
String DISPLAY\u NAME=Contacts contract.Contacts.DISPLAY\u NAME;
字符串HAS\u PHONE\u NUMBER=Contacts contract.Contacts.HAS\u PHONE\u NUMBER;
Uri PhoneCONTENT\u Uri=ContactsContract.CommonDataTypes.Phone.CONTENT\u Uri;
字符串Phone\u CONTACT\u ID=contacts contract.commondatatypes.Phone.CONTACT\u ID;
字符串编号=contacts contract.commonDataTypes.Phone.NUMBER;
Uri EmailCONTENT\u Uri=ContactsContract.CommonDataTypes.Email.CONTENT\u Uri;
字符串EmailCONTACT_ID=contacts contract.commondatatypes.Email.CONTACT_ID;
字符串数据=ContactsContract.CommonDataTypes.Email.DATA;
输出=新的StringBuffer();
ContentResolver ContentResolver=getContentResolver();
Cursor Cursor=contentResolver.query(CONTENT\u URI,null,null,
无效);
if(cursor.getCount()>0){
while(cursor.moveToNext()){
字符串联系人\u id=光标
.getString(cursor.getColumnIndex(_ID));
字符串名称=cursor.getString(cursor
.getColumnIndex(显示名称));
int hasPhoneNumber=Integer.parseInt(cursor.getString(cursor
.getColumnIndex(有电话号码));
如果(hasPhoneNumber>0){
output.append(“\n名字:“+Name”);
用户名。添加(名称);
//查询并循环联系人的每个电话号码
Cursor phoneCursor=contentResolver.query(
PhoneCONTENT\u URI,null,电话\u联系人\u ID+“=?”,
新字符串[]{contact_id},null);
while(phoneCursor.moveToNext()){
phoneNumber=phoneCursor.getString(phoneCursor
.getColumnIndex(编号));
输出。追加(“\n电话号码:“+phoneNumber”);
//userPhoneNumber.add(phoneNumber);
userNamePhno.put(姓名、电话号码);
}
phoneCursor.close();
//查询并循环联系人的每封电子邮件
Cursor emailCursor=contentResolver.query(
EmailCONTENT\u URI,null,EmailCONTACT\u ID+“=?”,
新字符串[]{contact_id},null);
while(emailCursor.moveToNext()){
email=emailCursor.getString(emailCursor
.getColumnIndex(数据));
输出。追加(“\n邮件:+电子邮件”);
//userEmailAddress.add(电子邮件);
用户名email.put(姓名、电子邮件);
}
emailCursor.close();
}
output.append(“\n”);
}
//outputText.setText(输出);
}
public class CustomAdapter extends ArrayAdapter<String> {
private Activity context;
private List<String> userName;
private Map<String, String> userNamePhno;
/*private List<String> userPhoneNumber;
private List<String> userEmailAddress;*/

public CustomAdapter(MainActivity mainActivity, List<String> userName, Map<String, String> userNamePhno) {
    super(mainActivity, R.layout.list_row, userName);
    this.context=mainActivity;
    this.userName = userName;
    this.userNamePhno=userNamePhno;
    /*this.userPhoneNumber = userPhoneNumber;
    this.userEmailAddress = userEmailAddress;*/

}
static class ViewHolder {
    public TextView userName;
    public TextView userNumber;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if(vi == null){

        LayoutInflater inflater = context.getLayoutInflater();
        vi = inflater.inflate(R.layout.list_row, null);
        ViewHolder holder = new ViewHolder();
        holder.userName=(TextView) vi.findViewById(R.id.contact_name);
        holder.userNumber=(TextView) vi.findViewById(R.id.contact_number);
        vi.setTag(holder);
    }
    ViewHolder holder = (ViewHolder) vi.getTag();
    holder.userName.setText("Name: "+userName.get(position).toUpperCase());
    holder.userNumber.setText("Ph No: "+userNamePhno.get(userName.get(position)));
    return vi;
}

}