使用姓名和电话号码选择多个联系人

Posted

技术标签:

【中文标题】使用姓名和电话号码选择多个联系人【英文标题】:Pick multiple contact with name and phone number 【发布时间】:2017-10-06 21:15:20 【问题描述】:

目前我的代码只能选择一个联系人并显示在选定的editText中,单击按钮添加后,详细信息将插入数据库中。 现在我想选择多个联系人并将它们插入数据库。什么是我实现这个的最佳方法?

下面是我当前的代码。

public class newBill extends AppCompatActivity implements View.OnClickListener

    //Defining views
    private EditText description;
    private EditText person_engaged;
    private EditText amount;
    private EditText contact;
    private String username;
    private Button buttonAdd;
    private Button buttonView;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_bill);

        ((Button)findViewById(R.id.btnBrowse)).setOnClickListener( new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

                intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                startActivityForResult(intent, 1);
            
        );

        //Initializing views

        description = (EditText) findViewById(R.id.description);
        person_engaged = (EditText) findViewById(R.id.person_engaged);
        amount = (EditText) findViewById(R.id.amount);
        contact=(EditText) findViewById(R.id.person_engaged_contact);

        buttonAdd = (Button) findViewById(R.id.buttonAdd);
        buttonView = (Button) findViewById(R.id.buttonView);

        //Setting listeners to button
        buttonAdd.setOnClickListener(this);
        buttonView.setOnClickListener(this);
    

    //get contact picker
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        if (data != null) 
            Uri uri = data.getData();

            if (uri != null) 
                Cursor c = null;
                try 
                    c = getContentResolver().query(uri, new String[]
                                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME ,
                            null, null, null);

                    if (c != null && c.moveToFirst()) 
                        String number = c.getString(0);
                        String name = c.getString(1);
                        showSelectedNumber(name, number);
                    
                 finally 
                    if (c != null) 
                        c.close();
                    
                
            
        
    

    public void showSelectedNumber(String name, String number) 
        Toast.makeText(this, name + ": " + number, Toast.LENGTH_LONG).show();
        person_engaged.setText(name);
        contact.setText(number);

    

    //Adding an bill
    private void addBills()

        final String desc = description.getText().toString().trim();
        final String person = person_engaged.getText().toString().trim();
        final String amo = amount.getText().toString().trim();
        final String contacts = contact.getText().toString().trim();

        //Fetching username from shared preferences
        SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
        username = sharedPreferences.getString(Config.USERNAME_SHARED_PREF,"Not Available");

        final String currentUser = username.toString().trim();

        class AddBills extends AsyncTask<Void,Void,String>

            ProgressDialog loading;

            @Override
            protected void onPreExecute() 
                super.onPreExecute();
                loading = ProgressDialog.show(newBill.this,"Adding...","Wait...",false,false);
            

            @Override
            protected void onPostExecute(String s) 
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(newBill.this,s,Toast.LENGTH_LONG).show();
                description.getText().clear();
                person_engaged.getText().clear();
                amount.getText().clear();
                contact.getText().clear();

            

            @Override
            protected String doInBackground(Void... v) 
                HashMap<String,String> params = new HashMap<>();
                params.put(Config.KEY_DESCRIPTION,desc);
                params.put(Config.KEY_PERSON_ENGAGED,person);
                params.put(Config.KEY_AMOUNT,amo);
                params.put(Config.KEY_PERSON_ENGAGED_CONTACT,contacts);
                params.put(Config.KEY_CREATED_BY_NAME,currentUser);

                RequestHandler rh = new RequestHandler();
                String res = rh.sendPostRequest(Config.URL_ADD, params);
                return res;
            
        

        AddBills ae = new AddBills();
        ae.execute();
    

    @Override
    public void onClick(View v) 
        if(v == buttonAdd)
            addBills();
        

        if(v == buttonView)
            startActivity(new Intent(this,ViewAllBills.class));
        
    

    //for sending direct sms notification
    public void sendSMS(String phoneNo, String msg) 
        try 
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(phoneNo, null, msg, null, null);
            Toast.makeText(getApplicationContext(), "Message Sent",
                    Toast.LENGTH_LONG).show();
         catch (Exception ex) 
            Toast.makeText(getApplicationContext(),ex.getMessage().toString(),
                    Toast.LENGTH_LONG).show();
            ex.printStackTrace();
        
    

【问题讨论】:

尝试android-contacts-extractor 以联系人列表的形式获取联系人输出 【参考方案1】:

您不能使用Intent.ACTION_GET_CONTENT Intent 来选择多个联系人。 您可以自己查询所有联系人及其电话号码,在 ListView 中显示给用户,并允许用户在您自己的应用中选择联系人。

要查询手机的联系人(如果您使用的是runtime-permissions,则需要Contacts 权限),您可以这样做:

List<String> allPhones = new ArrayList<>();
// The Phone class should be imported from CommonDataKinds.Phone
Cursor cursor = getContentResolver().query(Phone.CONTENT_URI, new String[]  Phone.DISPLAY_NAME, Phone.NUMBER , Phone.IN_VISIBLE_GROUP + "=1", null, Phone.TIMES_CONTACTED + " DESC"); 
while (cursor != null && cursor.moveToNext()) 
    String name = cursor.getString(0);
    String number = cursor.getString(1);
    allPhones.add(name + " - " + number);

// display allPhones in a ListView on screen, and handle item clicks

【讨论】:

以上是关于使用姓名和电话号码选择多个联系人的主要内容,如果未能解决你的问题,请参考以下文章

从具有两个以上联系号码的联系人中仅选择一个号码

android获取联系人图片、姓名和手机号码

Android 联系人选择器获取姓名 + 号码 + 电子邮件

多个联系人选取器列表

光标与每个联系人一个电话号码

我怎样才能获得 Viber 联系人(姓名和号码)?