Como implementar meu próprio esquema de URI no Android

161

Digamos que eu queira definir que um URI, como:

myapp://path/to/what/i/want?d=This%20is%20a%20test

deve ser tratado por meu próprio aplicativo ou serviço. Observe que o esquema é "myapp"e não "http", ou "ftp". É exatamente isso que pretendo: definir meu próprio esquema de URI globalmente para o sistema operacional Android. Isso é possível?

Isso é algo análogo ao que alguns programas já fazem em, por exemplo, sistemas Windows, como Skype ( skype://) ou qualquer programa de download torrent ( torrent://).

punnie
fonte
3
Duplicate
Casebash

Respostas:

215

Isto é 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 poderá criar seu próprio esquema. ( Mais sobre filtros de intenção e resolução de intenção 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>

Conforme a intenção implícita funciona, você precisa definir pelo menos uma ação e uma categoria; aqui escolhi VIEW como a ação (embora possa ser qualquer coisa) e certifique-se de adicionar a categoria DEFAULT (pois isso é necessário para todas as intenções implícitas). Observe também como eu adicionei a categoria BROWSABLE - isso não é necessário, mas permitirá que seus URIs possam ser abertos no navegador (um recurso bacana).

Dan Lew
fonte
11
Demorei um pouco para descobrir que, para vincular a um caminho específico, a variável "android: path" precisa especificar tudo após o protocolo, ou seja. ele deve estar no formato "youtube.com/myvideo"
Casebash
2
Funciona muito bem, mas como posso ler o valor do parâmetro GET "d" fornecido no URL de MyUriActivity?
Timo
não trabalhando para mim, tenho vários filtros de intenção para a mesma atividade. Um para o iniciador principal. segundo para abrir um arquivo específico terceiro como acima Os dois primeiros estão funcionando perfeitamente, mas não o terceiro.
mohitum 21/07
você pode Por favor, olhe a questão aqui stackoverflow.com/q/29116574/3828908
Salmaan
1
Versão em inglês do link acima, caso alguém precise.
Zensaburou 30/11/2015
67

Complementando a resposta @DanielLew , para obter os valores dos parâmetros, você deve fazer isso:

Exemplo de URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

na 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");
}
Diego Palomar
fonte
e se o link for como http://www.host.com/directory/value? Como podemos conseguir isso value?
Erros acontecem
3
Não importa, tenho a resposta SO aqui .
Erros acontecem
Como ler as tags de dados no AndroidManifest.xml no código sem usar metadados. Eu preciso que para enviar o esquema exato, caminho e host para o servidor também na chamada oauth. Não quero duplicar a declaração de retorno de chamada!
Pradeep Chakravarti Gudipati
@BugsHappen é o último segmento de caminho do URI. Useuri.getLastPathSegment();
Martin
25

Eu recomendo fortemente que você não defina seu próprio esquema. Isso contraria os padrões da Web para esquemas de URI, que tentam controlar rigidamente esses nomes por um bom motivo - para evitar conflitos de nomes entre diferentes entidades. Depois de colocar um link para seu esquema em um site, você coloca esse pequeno nome em todo o espaço de nomes da Internet e deve seguir esses padrões.

Se você quiser ter um link para seu próprio aplicativo, recomendo que você siga a abordagem descrita aqui:

Como registrar algum espaço para nome de URL (myapp: //app.start/) para acessar seu programa chamando uma URL no navegador no sistema operacional Android?

hackbod
fonte
2
Obrigado pelo alerta, mas vou usar isso apenas para tentar provar um conceito, em um ambiente fechado. Se esse experimento sair da fase de testes, considerarei definitivamente ratificar todo o negócio.
punnie
5
Ok ... mas por que não fazer a coisa certa? Não é mais nenhum trabalho significativo.
hackbod
2
O YouTube faz o que @hackbod está sugerindo, mas abrir os links do Youtube no facebook abre o navegador e não o aplicativo do Youtube. Esse mecanismo é "delicado" demais?
AlikElzin-Kilaka
19
Estou inclinado a definir meu próprio esquema para poder usar a mesma lógica da web para iniciar meu aplicativo iOS OU meu aplicativo Android. Apenas meus 2 centavos #
Chicowitz 10/10
1
@ hackbod Eu não acho que eles tinham o android em mente quando escreveram esse rfc. Embora eu esteja 100% com você de que não é necessário criar um novo esquema, acho que o motivo é exatamente esse: que nem mesmo é necessário para atingir a meta. E agora .. quando você gosta de facebook, whatsapp ou outras ferramentas tecnológicas grandes e estabelecidas - a regra "não crie um novo esquema de URI" - não se aplica mais a você, é claro. Não haverá colisão nos nomes dos esquemas quando o seu nome já estiver vinculado a uma empresa em escala global.
precisa saber é o seguinte
6

Outra abordagem alternativa ao Diego's é 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 transmitidos para a Atividade.

cristão
fonte
1

Como a pergunta é feita anos atrás, o Android evoluiu muito nesse esquema de URI.
Do esquema URI original, ao link direto, e agora Links para aplicativos do Android.

O Android agora recomenda usar URLs HTTP, não definir seu próprio esquema de URI. Como os Links de aplicativos para Android usam URLs HTTP vinculados a um domínio de seu site, nenhum outro aplicativo pode usar seus links. Você pode verificar a comparação entre links diretos e aplicativos Android a partir daqui

Agora você pode adicionar facilmente um esquema de URI usando a opção Android Studio: Ferramentas> Assistente de links para aplicativos. Consulte os detalhes no documento do Android: https://developer.android.com/studio/write/app-link-indexing.html

Weidian Huang
fonte