ouvrir une activité pour modifier le contact dans l'adaptateur de synchronisation
-
27-10-2019 - |
Question
Dans le SampleSyncAdapter Android il y a le morceau de code suivant:
/**
* Adds a profile action
*
* @param userId the userId of the sample SyncAdapter user object
* @return instance of ContactOperations
*/
public ContactOperations addProfileAction(long userId) {
mValues.clear();
if (userId != 0) {
mValues.put(SampleSyncAdapterColumns.DATA_PID, userId);
mValues.put(SampleSyncAdapterColumns.DATA_SUMMARY, mContext
.getString(R.string.syncadapter_profile_action));
mValues.put(SampleSyncAdapterColumns.DATA_DETAIL, mContext
.getString(R.string.view_profile));
mValues.put(Data.MIMETYPE, SampleSyncAdapterColumns.MIME_PROFILE);
addInsertOp();
}
return this;
}
J'ai ajouté ce filtre pour que mon activité
<intent-filter>
<action android:name="@string/syncadapter_profile_action" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.myapp.profile"
android:host="contacts" />
</intent-filter>
où SampleSyncAdapterColumns.MIME_PROFILE = vnd.android.cursor.item / vnd.myapp.profile
J'ai ajouté un contact et je peux voir l'entrée mais quand je clique dessus rien ne se passe. Que dois-je faire pour commencer une activité lorsque l'utilisateur clique dessus? Je suis en train de faire ce qui est suggéré pour les appareils pré-nid d'abeille: l'astuce consiste à insérer une ligne de données, « Modifier dans MyApp », qui prendrait à l'utilisateur de votre application et votre application fournirait alors une activité de l'éditeur
La solution
Je pense que votre filtre intention pourrait être incorrect. Selon cette d'entrée, les éléments d'action et corriger les données devraient quelque chose comme ce qui suit:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.myapp.profile" />
</intent-filter>
Autres conseils
est ce que je faisais. Dans le fichier manifest j'ai ajouté ces filtres pour une intention de mon activité
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.myapp.profile" />
</intent-filter>
<intent-filter >
<action android:name="android.intent.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="contacts"
android:mimeType="vnd.android.cursor.item/person" />
<data
android:host="com.android.contacts"
android:mimeType="vnd.android.cursor.item/contact" />
<data
android:host="com.android.contacts"
android:mimeType="vnd.android.cursor.item/raw_contact" />
</intent-filter>
Le premier sera diffusé lorsque l'utilisateur clique sur l'action de profil que j'ai ajouté des comptes dans mon adaptateur de synchronisation utilisant le code dans l'échantillon adaptateur de synchronisation (voir ci-dessus)
Le second vous permet de gérer l'intention qui est boradcasted par le carnet d'adresses natif lorsque l'utilisateur souhaite modifier le contact. Considérez que dans le premier cas parce que le type MIME est que l'un de vos SyncAdapter votre activité sera appelée directement. Dans le second cas, une boîte de dialogue sera affiché avec la liste des applications enregistrées pour gérer la android.intent.action.EDIT pour Android: mimeType = « vnd.android.cursor.item / personne », android: mimeType = "vnd.android .cursor.item / contact » etc
Dans mon activité, j'ai une méthode comme ceci:
boolean handleIntent(Intent intent) {
String action = intent.getAction();
Uri uri = intent.getData();
if (action.equalsIgnoreCase(Intent.ACTION_VIEW)) {
handleProfileAction(uri); // in this case uri points to ProfileAction Data raw that is one of the Data that your sync adaoter has added in the raw contact
} else if (action.equalsIgnoreCase(Intent.ACTION_EDIT)) {
editYourContact(uri); // in this case the uri points to the Contact containing you raw contact although at least on SonuEricsson Xperia mini when this intent is broadcasted by the context menu "edit contact" command I receive the URI of the raw contact when there is only one.
}
return true;
}