Como implementar meu próprio esquema de URI no Android
-
20-09-2019 - |
Pergunta
Digamos que eu queira definir um URI como:
myapp://path/to/what/i/want?d=This%20is%20a%20test
deve ser tratado pelo meu próprio aplicativo ou serviço.Observe que o esquema é "myapp"
e não "http"
, ou "ftp"
.É exatamente isso que pretendo:para definir meu próprio esquema URI globalmente para o sistema operacional Android.Isso é possível?
Isso é um tanto análogo ao que alguns programas já fazem, por exemplo, em sistemas Windows, como o Skype (skype://
) ou qualquer programa de download de torrent (torrent://
).
Solução
Isso é muito possível; você define o esquema de URI no seu AndroidManifest.xml, usando o <data>
elemento. Você configura um filtro de intenção com o <data>
Elemento preenchido e você poderá criar seu próprio esquema. (Mais sobre filtros de intenção e resolução de intenções aqui.)
Aqui está um pequeno exemplo:
<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>
De acordo com o funcionamento das intenções implícitas, você precisa definir pelo menos uma ação e uma categoria também; Aqui, escolhi a visão como a ação (embora pudesse ser qualquer coisa) e certifique -se de adicionar a categoria padrão (como isso é necessário para todas as intenções implícitas). Observe também como adicionei a categoria navegável - isso não é necessário, mas permitirá que seus URIs sejam abertos no navegador (um recurso bacana).
Outras dicas
Complementando o @Daniellew Responda, para obter os valores dos parâmetros, você deve fazer isso:
Exemplo de URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo
em sua atividade:
Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
String valueOne = uri.getQueryParameter("keyOne");
String valueTwo = uri.getQueryParameter("keyTwo");
}
Eu recomendo fortemente que você não defina seu próprio esquema. Isso vai contra os padrões da Web para esquemas de URI, que tentam controlar rigidamente esses nomes por um bom motivo - para evitar conflitos de nome entre diferentes entidades. Depois de colocar um link para o seu esquema em um site, você colocou esse pequeno nome em todo o espaço de nome da Internet e deve seguir esses padrões.
Se você só deseja ter um link para seu próprio aplicativo, recomendo que você siga a abordagem que descrevi aqui:
Outra abordagem alternativa à de Diego é usar uma biblioteca:
https://github.com/airbnb/DeepLinkDispatch
Você pode declarar facilmente os URIs que deseja manipular e os parâmetros que deseja extrair por meio de anotações na atividade, como:
@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
...
}
Além disso, os parâmetros de consulta também serão repassados para a atividade.
Como a pergunta é feita anos atrás, e o Android evoluiu muito neste esquema de URI.
Do esquema de URI original, a link profundo e agora os links de aplicativos Android.
O Android agora recomenda usar URLs HTTP, não definir seu próprio esquema de URI. Como os links do aplicativo Android usam URLs HTTP que vinculam a um domínio do site que você possui, para que nenhum outro aplicativo possa usar seus links. Você pode verificar a comparação de links de link profundo e links de aplicativos Android de aqui
Agora você pode adicionar facilmente um esquema de URI usando a opção Android Studio: Ferramentas> App Links Assistant. Por favor, consulte o detalhe do documento Android: https://developer.android.com/studio/write/app-link-indexing.html