如果联系人与电话地址簿中的应用程序相关联,则显示应用程序图标

问题描述:

我正在尝试显示与该应用程序关联的电话号码的应用程序图标。如果联系人与电话地址簿中的应用程序相关联,则显示应用程序图标

我试图按照this链接,但它太难了。
有没有这个或任何简单的方法来解决这个问题的任何库?

例如,我们可以说该联系人存在于手机通讯录中的whatsapp,facebook,google,...中。
同样,我想在这些消息应用程序旁边显示我的应用程序图标。

As shown below

+0

有你有你的解决方案?如果是,请分享..... – Rahul

+0

@Rahul不,我没有得到解决方案。如果你知道它,欢迎你 –

+0

这两个链接帮助我解决这个问题[第一部分](http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/ )[第2部分](http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/)@Kartheek – Rahul

下面的代码显示一个可能的解决方案。调用synchronizeContact方法将导致添加联系人应用程序中的链接。 请注意,它还不是健壮的代码,但它显示了这个想法并且正在工作。 另请注意,以下两个POJO类特定于我的实现,对于联系人链接的工作不是必不可少的:PhoneNumber,ContactInfo。

MainActivity.java:

private void synchronizeContact(ContactInfo contactInfo) 
{ 
    ContactsSyncAdapterService syncAdapter = new ContactsSyncAdapterService(); 
    Account account = new Account(contactInfo.getDisplayName(), getString(R.string.account_type)); //account_type = <yourpackage>.account 
    PhoneNumber phoneNumber = contactInfo.getPhoneNumbers().get(0); 
    syncAdapter.performSync(MainActivity.this, account, phoneNumber); 
} 

ContactsSyncAdapterService:

private static ContentResolver itsContentResolver = null; 

public void performSync(Context context, Account account, PhoneNumber number) 
{ 
    itsContentResolver = context.getContentResolver(); 
    addContact(account, account.name, account.name, number.getNumber()); 
} 

private void addContact(Account account, String name, String username, String number) 
{ 
    ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>(); 

    ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI); 
    builder.withValue(RawContacts.ACCOUNT_NAME, account.name); 
    builder.withValue(RawContacts.ACCOUNT_TYPE, account.type); 
    builder.withValue(RawContacts.SYNC1, username); 
    operationList.add(builder.build()); 

    builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, 0); 
    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name); 
    operationList.add(builder.build()); 

    builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); 
    builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.<yourpackage>.profile"); 
    builder.withValue(ContactsContract.Data.DATA1, username); 
    builder.withValue(ContactsContract.Data.DATA2, number); 
    operationList.add(builder.build()); 

    try 
    { 
     itsContentResolver.applyBatch(ContactsContract.AUTHORITY, operationList); 
    } 
    catch (OperationApplicationException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (RemoteException e) 
    { 
     e.printStackTrace(); 
    } 
} 

ProfileActivity(类敲击接触应用链接时的意图):

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.profile); 

    Uri intentData = getIntent().getData(); 
    if (isNotEmpty(intentData)) 
    { 
     Cursor cursor = managedQuery(intentData, null, null, null, null); 
     if (cursor.moveToNext()) 
     { 
      String username = cursor.getString(cursor.getColumnIndex("DATA1")); 
      String number = cursor.getString(cursor.getColumnIndex("DATA2")); 
      TextView view = (TextView) findViewById(R.id.profiletext); 
      view.setText("<yourtext>"); 
      doSomething(getPhoneNumber(number)); 
     } 
    } 
    else 
    { 
     handleIntentWithoutData(); 
    } 
} 

private void doSomething(PhoneNumber phoneNumber) 
{ 
    Uri uri = Uri.parse("tel:" + phoneNumber.getNumber()); 
    Intent intent = new Intent(Intent.ACTION_CALL, uri); 
    startActivity(intent); 
} 

contacts.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ContactsSource xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ContactsDataKind 
     android:icon="@drawable/ic_launcher" 
     android:mimeType="vnd.android.cursor.item/vnd.<yourpackage>.profile" 
     android:summaryColumn="data2" 
     android:detailColumn="data3" 
     android:detailSocialSummary="true" 
    /> 

authenticator.xml:

<?xml version="1.0" encoding="utf-8"?> 
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accountType="<yourpackage>.account" 
    android:icon="@drawable/ic_launcher" 
    android:smallIcon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:accountPreferences="@xml/account_preferences" 
/> 

account_preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
</PreferenceScreen> 

sync_contacts.xml:

<?xml version="1.0" encoding="utf-8"?> 
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
    android:contentAuthority="com.android.contacts" 
    android:accountType="<yourpackage>.account" 
    android:supportsUploading="false" 
/> 

电话号码:

private String number; 

public String getNumber() 
{ 
    return number; 
} 

public void setNumber(String number) 
{ 
    this.number = number; 
} 

的ContactInfo:

private List<PhoneNumber> itsPhoneNumbers = new ArrayList<PhoneNumber>(); 

public void setDisplayName(String displayName) 
{ 
    this.itsDisplayName = displayName; 
} 

public String getDisplayName() 
{ 
    return itsDisplayName; 
} 

public void addPhoneNumber(PhoneNumber phoneNumber) 
{ 
    this.itsPhoneNumbers.add(phoneNumber); 
} 

public List<PhoneNumber> getPhoneNumbers() 
{ 
    return itsPhoneNumbers; 
} 
+1

不完整的代码。 –

+0

我必须在哪里定义ProfileActivity? – toni

+0

AndroidManifest.XML: intent-filter> toni