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://).

Foi útil?

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:

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top