Abra una actividad para editar contacto en el adaptador de sincronización
-
27-10-2019 - |
Pregunta
En el Android SamplesnCadapter hay la siguiente pieza de código:
/**
* 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;
}
Agregué esto como filtro para mi actividad
<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>
donde samplesyncadaptercolumns.mime_profile = vnd.android.cursor.item/vnd.myapp.profile
Agregué un contacto y puedo ver la entrada, pero cuando hago clic en él, no sucede nada. ¿Qué debo hacer para comenzar una actividad cuando el usuario hace clic en ella? Estaba tratando de hacer lo que se sugiere Aquí Para dispositivos anteriores a Honeycomb: El truco es insertar una fila de datos, "Editar en MyApp", que llevaría al usuario a su aplicación y a su aplicación proporcionaría una actividad de editor
Solución
Creo que su filtro de intención podría ser incorrecto. De acuerdo a esta entrada, los elementos de acción y datos correctos deberían ser algo como lo siguiente:
<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>
Otros consejos
Esto es lo que hice. En el archivo manifiesto agregué estos filtros de intención para uno de mi actividad
<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>
El primero se transmitirá cuando el usuario haga clic en la acción de perfil que agregué en mis cuentas de adaptador de sincronización utilizando el código en el adaptador de sincronización de muestra (ver arriba)
El segundo le permite manejar la intención que la libreta de direcciones nativas es boradada cuando el usuario desea editar el contacto. Considere que en el primer caso porque el MIMETYPE es que uno de sus syncAdapter se llamará directamente a su actividad. En el segundo caso, se mostrará un cuadro de diálogo con la lista de aplicaciones registradas para manejar el android.intent.action.edit para android: mimetype = "vnd.android.cursor.item/persona", android: mimetype = "vnd.android .cursor.Item/Contact ", etc.
En mi actividad tengo un método como este:
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;
}