从calllog中选择一个数字而不重复相同的数字

时间:2014-08-05 07:47:21

标签: android

我希望用户从calllog中选择一个数字,然后选择该数字并进入活动。所以我创建了自定义calllog列表。我使用了这段代码,但没有按正确的顺序显示通话记录列表

首先它显示了第一个数字的callhistory完全在calllog列表中显示

第二我也想显示这个名字,我尝试了很多,但我无法做到

任何人都可以告诉我在此代码中做出哪些修改以使其正确

我使用的代码是:

String[] callLogFields = { android.provider.CallLog.Calls._ID,
                android.provider.CallLog.Calls.NUMBER,
                android.provider.CallLog.Calls.CACHED_NAME };
        String viaOrder = android.provider.CallLog.Calls.DATE + " DESC";
        String WHERE = android.provider.CallLog.Calls.NUMBER + " >0"; /*filter out private/unknown numbers */

        final Cursor callLog_cursor = this.getContentResolver().query(
                android.provider.CallLog.Calls.CONTENT_URI, callLogFields,
                WHERE, null, viaOrder);

        AlertDialog.Builder myversionOfCallLog = new AlertDialog.Builder(this);

        android.content.DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int item) {
                callLog_cursor.moveToPosition(item);

                Log.v("number", callLog_cursor.getString(callLog_cursor
                        .getColumnIndex(android.provider.CallLog.Calls.NUMBER)));

                callLog_cursor.close();

            }
        };
        myversionOfCallLog.setCursor(callLog_cursor, listener,
                android.provider.CallLog.Calls.NUMBER);
        myversionOfCallLog.setTitle("Choose from Call Log");
        myversionOfCallLog.create().show();

3 个答案:

答案 0 :(得分:1)

  1. 为了保存没有重复的数字,正如MysticMagic建议的那样,使用' Set'根据评论中给出的链接。

  2. 要从电话号码中获取联系人姓名,请使用代码:

  3. Reference

       private String getContactName(Context context, String number) {
    
       String name = null;
    
       // define the columns I want the query to return
       String[] projection = new String[] {
                        ContactsContract.PhoneLookup.DISPLAY_NAME,
                        ContactsContract.PhoneLookup._ID};
    
       // encode the phone number and build the filter URI
       Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    
       // query time
       Cursor cursor = context.getContentResolver().query(contactUri, projection, null, null, null);
    
       if(cursor != null) {
              if (cursor.moveToFirst()) {
                        name =            cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
                        Log.v(TAG, "Started uploadcontactphoto: Contact Found @ " + number);                        
                        Log.v(TAG, "Started uploadcontactphoto: Contact name  = " + name);
              } else {
                        Log.v(TAG, "Contact Not Found @ " + number);
              }
              cursor.close();
       }
       return name;
       }
    

    另请参阅here以获取在电话记录中提取姓名的其他方法

     Uri allCalls = Uri.parse("content://call_log/calls");
     Cursor c = managedQuery(allCalls, null, null, null, null);
    
    String num= c.getString(c.getColumnIndex(CallLog.Calls.NUMBER));// for  number
    String name= c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME));// for name
    String duration = c.getString(c.getColumnIndex(CallLog.Calls.DURATION));// for duration
    int type = Integer.parseInt(c.getString(c.getColumnIndex(CallLog.Calls.TYPE)));// for call type, Incoming or out going
    

答案 1 :(得分:1)

您可以在Set中添加联系号码,这样可以防止添加重复的联系号码。然后根据需要将Set的数据添加到listview。

Set<String> setNumbers = new HashSet<String>();
String callNumber = cursor.getString(cursor.getColumnIndex(
                                        android.provider.CallLog.Calls.NUMBER));

setNumbers.add(callNumber);

希望这有帮助。

答案 2 :(得分:0)

最后,这是在MysticMagic和Nishanthi Grashia的帮助下工作的代码

Set setA;
setA = new HashSet();

public void getCallLog() {

        try {
            final String[] projection = null;
            final String selection = null;
            final String[] selectionArgs = null;
            final String sortOrder = "DATE DESC";
            final Cursor cursor = this.getContentResolver().query(
                    Uri.parse("content://call_log/calls"), projection,
                    selection, selectionArgs, sortOrder);
            if (cursor != null) {
                // Loop through the call log.
                while (cursor.moveToNext()) {
                    // Common Call Log Items
                    String callNumber = cursor
                            .getString(cursor
                                    .getColumnIndex(android.provider.CallLog.Calls.NUMBER));

                    setA.add(callNumber);

                }

                generateList();
            }

        } catch (Exception e) {

        }

    }

    @SuppressLint("NewApi")
    private void generateList() {
        // TODO Auto-generated method stub
        try {
            Object[] calllist = new String[setA.size()];

            calllist = setA.toArray();
            String scalllist[] = Arrays.copyOf(calllist, calllist.length,
                    String[].class);
            for (int i = 0; i < scalllist.length; i++) {
                scalllist[i] = scalllist[i] + "  "
                        + getContactName(this, scalllist[i]);
            }
            final Dialog d = new Dialog(this);
            d.setContentView(R.layout.dialog1);
            d.setTitle("Choose from Call Log...");

            final ListView lv1 = (ListView) d.findViewById(R.id.listView1);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, android.R.id.text1,
                    scalllist);

            lv1.setAdapter(adapter);
            lv1.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    // TODO Auto-generated method stub
                    String clickednumber[] = (lv1.getItemAtPosition(arg2)
                            .toString()).split("  ");
                    usernumber.setText(clickednumber[0]);
                    try {
                        username.setText(clickednumber[1]);
                    } catch (ArrayIndexOutOfBoundsException e) {
                        username.setText(" ");
                    }
                    d.dismiss();
                }
            });
            d.show();
        } catch (Exception e) {

        }
    }
private String getContactName(Context context, String number) {

        String name = null;
        try {

            // define the columns I want the query to return
            String[] projection = new String[] {
                    ContactsContract.PhoneLookup.DISPLAY_NAME,
                    ContactsContract.PhoneLookup._ID };

            // encode the phone number and build the filter URI
            Uri contactUri = Uri.withAppendedPath(
                    ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
                    Uri.encode(number));

            // query time
            Cursor cursor = context.getContentResolver().query(contactUri,
                    projection, null, null, null);

            if (cursor != null) {
                if (cursor.moveToFirst()) {
                    name = cursor
                            .getString(cursor
                                    .getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));

                } else {
                    name = "  ";
                }
                cursor.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return name;

    }