programacion - Cómo implementar mi propio esquema de URI en Android
manual android studio avanzado (4)
Digamos que quiero definir un URI como:
myapp://path/to/what/i/want?d=This%20is%20a%20test
debe ser manejado por mi propia aplicación o servicio. Tenga en cuenta que el esquema es "myapp"
y no "http"
, o "ftp"
. Eso es precisamente lo que pretendo: definir mi propio esquema de URI globalmente para el sistema operativo Android. es posible?
Esto es algo análogo a lo que algunos programas ya hacen en, por ejemplo, los sistemas de Windows, como Skype ( skype://
) o cualquier programa de descarga de torrent://
( torrent://
).
Complementando la respuesta de @DanielLew, para obtener los valores de los parámetros, debe hacer esto:
Ejemplo de URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo
en tu actividad:
Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
String valueOne = uri.getQueryParameter("keyOne");
String valueTwo = uri.getQueryParameter("keyTwo");
}
Esto es muy posible; usted define el esquema de URI en su AndroidManifest.xml, usando el elemento <data>
. Configura un filtro de intención con el elemento <data>
completado, y podrá crear su propio esquema. ( Más sobre filtros de intención y resolución de intención aquí ).
Aquí hay un pequeño ejemplo:
<activity android:name=".MyUriActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="path" />
</intent-filter>
</activity>
Según cómo funcionan los intentos implícitos, debe definir al menos una acción y una categoría también; aquí escogí VER como la acción (aunque podría ser cualquier cosa), y me aseguré de agregar la categoría POR DEFECTO (como se requiere para todos los intentos implícitos). También observe cómo agregué la categoría BROWSABLE: esto no es necesario, pero permitirá que sus URI se puedan abrir desde el navegador (una característica ingeniosa).
Otro enfoque alternativo a Diego es usar una biblioteca:
https://github.com/airbnb/DeepLinkDispatch
Puede declarar fácilmente los URI que desea manejar y los parámetros que desea extraer a través de anotaciones en la Actividad, como:
@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
...
}
Como ventaja, los parámetros de consulta también se transmitirán a la Actividad también.
Recomiendo encarecidamente que no defina su propio esquema. Esto va en contra de los estándares web para esquemas de URI, que intenta controlar rígidamente esos nombres por una buena razón: para evitar conflictos de nombres entre diferentes entidades. Una vez que coloca un enlace a su esquema en un sitio web, ha puesto ese pequeño nombre en el espacio de nombre entero de Internet, y debe seguir esos estándares.
Si solo quieres tener un enlace a tu propia aplicación, te recomiendo que sigas el enfoque que describí aquí: