我正在尝试将自定义数据字段和MIME类型添加到"联系人"屏幕.有没有办法做到这一点,当用户用我保存在其上的数据查看联系人时,我的字段会出现在那里?这是我见过其他应用程序所做的事情 - 例如,Facebook,Twitter,Last.fm等应用程序如何将其状态信息添加到联系人?我似乎无法从Contacts API文档中找到它.
我想知道是否有一种干净的方式导入vcard作为Android联系人.我有一个vcard解析器,但映射每个可能的vcard字段和字段类型将是一个痛苦的,容易出错的练习.有没有更好的办法?
一个Android联系人看起来像一个vcard,所以我怀疑他们内部使用vcards.但是,没有公共API.
有人知道如何获取属于Android中1个特定群组的联系人列表吗?
我需要这样的东西:
Select * from contacts where group_id = "1234"
Run Code Online (Sandbox Code Playgroud)
我可以使用以下内容获取所有联系人或所有组的列表:
Cursor groupCursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
final ArrayList<String> contacts = new ArrayList<String>();
while(groupCursor.moveToNext()) {
String name = groupCursor.getString(groupCursor.getColumnIndex(ContactsContract.Constacts.DisplayName ));
contacts.add(name);
}
Run Code Online (Sandbox Code Playgroud) 我目前正在使用Android联系人内容提供商,目前可以使用以下代码访问联系人完整显示名称而不会出现问题:
String[] PROJECTION = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER,
};
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")"
+ " LIKE '" + constraint + "%' " + "and " +
ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI,
PROJECTION, SELECTION, null, sortOrder);
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够分别获得联系人名字和姓氏,我试图使用StructuredName试图获得这个,但我似乎无法让它工作.
任何人都可以指出我正确的方向如何正确使用StructuredName将名称拆分为First和Last?
更新:
根据hovanessyan的建议,我尝试了以下方法:
String[] PROJECTION = new String[] {
ContactsContract.Data._ID,
ContactsContract.Data.DISPLAY_NAME,
ContactsContract.Data.HAS_PHONE_NUMBER,
};
String SELECTION = ContactsContract.CommonDataKinds.StructuredName.IN_VISIBLE_GROUP + " = '1'";
String sortOrder = ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME …
Run Code Online (Sandbox Code Playgroud) 如何使用Google API将Android原生联系人同步到Google帐户.提供一些有用的链接.
我的目标是只向用户显示带有电话号码的联系人,让用户选择我想在本地存储的少数联系人.
我在下面的方法中使用了各种选项来代替ContactsContract.Contacts.CONTENT_URI.但是我收到很多联系人(很多都是垃圾邮件,只有电子邮件ID).
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_selector);
((Button)findViewById(R.id.btnphonecontactlist)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent contactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(contactIntent, 1);
}
});
}
Run Code Online (Sandbox Code Playgroud)
如果我将ContactsContract.Contacts.CONTENT_URI作为上述方法的参数传递,并且在下面的处理程序方法的情况下,将查询方法的String []作为投影参数(显示为注释),则该方法将失败并返回java.lang.IllegalArgumentException.如果我在下面的方法中传递null,那么无论我选择什么联系人,我都找不到任何与电话号码或电子邮件相关的列.
@Override
public 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, null
// new String[] {
//ContactsContract.CommonDataKinds.Phone.NUMBER,
//ContactsContract.CommonDataKinds.Phone.TYPE},
, null, null, null);
if(c != …
Run Code Online (Sandbox Code Playgroud) 我正在对AsyncTaskLoader进行一些实际操作,因此我可以使用该技术加载联系人列表.代码工作的唯一情况是,当我实现从延伸到一类的回调Fragment
中MyLoader extends Fragment implements LoaderCallbacks<ArrayList<Contact>>
.还有另外一种方法吗?我真正需要的是联系人列表(姓名,电话,缩略图),发送到我的后端.例如,当我尝试使用时Context
,因为我可以通过简单的操作从任何活动中获得它(Context)this
,所以代码甚至无法编译.我的意思是上下文
context.getLoaderManager().initLoader(1, null, this);
//I already changed to Fragment so don't really remember the exact ".context" line.
//But someone who has done this will understand the snippet.
Run Code Online (Sandbox Code Playgroud)
顺便说一句:我正在使用多个参考文献.一个是http://developer.android.com/reference/android/content/AsyncTaskLoader.html.
问题(再次):我可以使用没有Fragment或FragmentActivity的AsyncTaskLoader吗?
与碎片一起使用的代码:
package com.example.contactpreload.utils;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
public class LoadingContacts extends Fragment implements LoaderCallbacks<ArrayList<Contact>> {
ArrayList<Contact> loadedContacts;
static Fragment fragmentActivity;
public static LoadingContacts newInstance(int arg) {
LoadingContacts f = new LoadingContacts(); …
Run Code Online (Sandbox Code Playgroud) 我试图以编程方式修改联系人的显示名称:
try {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(ContactsContract.CommonDataKinds.Phone._ID + " = ?", new String[] {contact_id})
.withValue(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, "anything")
.build());
ContentProviderResult[] result = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
Log.w("UpdateContact", e.getMessage()+"");
for(StackTraceElement ste : e.getStackTrace()) {
Log.w("UpdateContact", "\t" + ste.toString());
}
Context ctx = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(ctx, "Update failed", duration);
toast.show();
}
Run Code Online (Sandbox Code Playgroud)
contact_id
被ContactsContract.CommonDataKinds.Phone._ID
聚集在以前的活动
代码执行正常,但是:
ContentProviderResult[]
结果为空我也尝试了Data.DISPLAY_NAME
但效果相同.
我阅读了手册:http://developer.android.com/guide/topics/providers/contacts-provider.html但我不想调用本机意图.
谢谢.
android android-contentresolver contactscontract android-contacts
我已经创建了一个自定义帐户类型,我可以在android ContactsContract ContentProvider中成功创建该类型的联系人.但是,在编辑默认联系人应用程序中的联系人时,我很难弄清楚如何获取我的自定义帐户标签和图标.
编辑自定义联系人类型时,标签应为"联系人",右侧是应用程序图标.相反,编辑我的类型的联系人始终显示"仅限电话,未同步的联系人"标签.有关示例,请参见下面的第一个屏幕截图
奇怪的是,它确实提取了我的帐户名称,您可以在错误标签下面的屏幕截图中看到它(以"+1415"开头).
我已经在帐户下的设置应用程序中成功显示了我的应用程序的标签和图标,所以我知道我正在做正确的事情.请参阅下面的第二个屏幕截图,以获取相关证明(帐户标签为"Bolt").
我有以下authenticator.xml:
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="@string/account_type"
android:label="@string/app_name"
android:icon="@drawable/app_icon"
android:smallIcon="@drawable/app_icon" />
Run Code Online (Sandbox Code Playgroud)
这是我的syncadapter.xml:
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="@string/contacts_content_authority"
android:accountType="@string/account_type"
android:userVisible="true"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"
android:supportsUploading="false" />
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出我哪里出错吗?我可以根据需要提供更多信息.我尝试使用CLIENT_IS_SYNCADAPTER参数从我的SyncAdapter中创建联系人但没有改变任何内容.我也尝试过其他一些东西,但还没有任何工作.
android android-syncadapter android-contacts android-account
我正在运行一个查询CommonDataKinds.Phone.CONTENT_URI
,我得到的所有结果都有一个NOT NULL手机ID.
几乎是代码:
String[] projection2 = new String[] {
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
};
String where2 = ContactsContract.CommonDataKinds.Phone._ID + " != ''" ;
Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection2, where2, null, null);
Run Code Online (Sandbox Code Playgroud)
然后我遍历每个游标结果并获得我想要的列.代码是:
if (phoneCursor.getCount() > 0) {
while (phoneCursor.moveToNext()) {
String contacts_id = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.Contacts._ID));
String phone_id = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
Log.i("phonecursor", "contacts_id= " + contacts_id + " phone_id " + phone_id
+ " contacts_name= " + contacts_name + " phone_name= " + phone_name
+ " Phone= " + phone …
Run Code Online (Sandbox Code Playgroud) android ×10
android-contacts ×10
contacts ×1
cursor ×1
google-api ×1
java ×1
list ×1
sync ×1
vcf-vcard ×1