I have struggled with this problem for the better part of this afternoon. There are several iterations of this question posted in the support forums, and so far I have not seen a single satisfactory answer. But I stumbled upon a solution. Others were on the threshold of the solution by suggesting that the individual contacts you want removed be deleted from Contacts and, if you wished to retain them as email contacts, recreated.
This solution works in that, after performing it, the following will be true (1) no one will be able to see your Chat or Google Talk status unless you have invited that person or accepted their invitation and (2) no one will be able to send you instant messages without you first inviting that person or accepting their invitation.
The best way to perform this solution is in a secondary browser, if you have one, because it requires the deletion of all cookies, cache, and history in the browser. This may not be absolutely essential to the solution, but I did not test the solution without this step.
Warning: this solution requires the user to backup all contacts, delete all contacts, and then restore them. I have done this with three of my Gmail accounts and all contacts were restored without any problems. However, do this at your own risk.
- Log into your Gmail account.
- Go to Settings / Chat and confirm that the option "Only allow people that I've explicitly approved to chat with me and see when I'm online" is checked.
- Log off Chat.
- Open Contacts, select Export (top right), select "Everyone (All Contacts)", make sure "Google CSV" is selected, and click "Export." Save the file to a location where you will be able to find it easily.
- Click "All Contacts" in the left hand pane, click "Select: All" in the middle pane, and click "Delete Contacts" in the right hand pane. Confirm the deletion.
- Exit Contacts and open it again to confirm that you have 0 contacts in all groups.
- Close all instances of the browser you are using (ideally, confirm in Task Manager that the process for the browser has been ended...this is for PCs).
- Reopen the browser, clear all history, cache, and cookies.
- Close the browser and reopen.
- Log into Gmail.
- In Chat, click "Options" and select "All Contacts" in "Show in Chat List" (you may still see names in the list at this point - don't worry about this).
- Click Contacts. If any of the contact groups have any contacts in them, select all and delete again. (In my case, a couple of names crept back in for some reason.)
- Select "Import" in the right pane.
- Click "Choose File" and find the exported contact list (default name is "google.csv").
- Do NOT select "Also add these imported contacts to..." The exported contacts contain group information and all groups will be recreated as they existed prior to deletion.
- Click "Import."
- Shut down the browser, reopen, and log back into Gmail.
- At this point, if your Chat list is empty, you are done. In my case it wasn't, but I confirmed that the people in the list at this point were unable to see my online status and if they tried to send me a chat, I would receive a prompt in the Chat window asking me if I wished to accept their invitation. Clicking "no" would not add them to the list, and they would remain unable to see my online status or to chat with me absent an accepted invitation. However, you have the option of cleaning up this phantom chat list:
18a. Hover over each remaining name in the Chat list, mouse over to "More," click it, and select "Never Show." The interesting part is that though you get a confirmation of this action in the top bar of Gmail, it doesn't always actually remove the name from the list. You may have to click on "Never Show" a couple of times, or log out and log back in, or perhaps something else. This appears to be a bug. One thing I found that worked was to have someone (anyone) send me a chat invite, decline the invitation, and then the list emptied on its own. But when I logged back in I had a couple of other phantom names. I have confirmed several times that these people are unable to see my online status or send me chats without first sending me an invitation.
Sorry for the verbosity of this writeup, but this is what worked for me and I wanted to share it. Good luck!