2014-02-11 2 views
9

Я пытаюсь отобразить значок приложения для номера телефона, связанного с приложением.Отобразите значок приложения, если контакт связан с приложением в телефонной адресной книге

Я попытался следовать за ссылкой this, но это слишком сложно.
Есть ли библиотека для этого или любой простой способ решить эту проблему?

Например, мы можем сказать, что контакт присутствует в whatsapp, facebook, google, ... в телефонной адресной книге.
Аналогичным образом я хочу отобразить значок своего приложения рядом с этими приложениями для обмена сообщениями.

As shown below

+0

Вы получили свое решение ?? Если да, пожалуйста, поделитесь ..... – Rahul

+0

@Rahul Нет. У меня не было решения. Если вы это знаете, то приветствуются –

+0

Эти две ссылки помогли мне решить эту проблему [Часть 1] (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

ответ

5

Следующий код показывает возможное решение. Вызов метода 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: <деятельность android: name = ".ProfileActivity " android: label =" @ string/app_name "> <замысел-фильтр> toni

Смежные вопросы