Como chamar uma Activity de outro app no Android: guia completo em Kotlin

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que chamar uma Activity de outro aplicativo?

\n\n

Imagine que você está criando um aplicativo de notas e quer permitir que o usuário tire uma foto diretamente da sua interface. Ou, digamos, seu mensageiro precisa abrir contatos da agenda. Em ambos os casos, você precisa chamar uma Activity de outro aplicativo no Android.

\n\n

Essa é uma das perguntas mais populares no Stack Overflow (milhares de visualizações e centenas de votos). E não é à toa: se feito incorretamente, o app pode travar com ActivityNotFoundException ou, pior, criar um risco de segurança. Neste tutorial, vamos abordar todos os detalhes em Kotlin para que você possa integrar telas externas em seus projetos com confiança.

\n\n

A propósito, você está no site PythonLib, onde falamos muito sobre Python, mas hoje é um caso especial. Desenvolvimento Android com Kotlin é uma habilidade poderosa que combina perfeitamente com um backend em Python. Vamos nessa!

\n\n

O que é Intent e por que é a chave para a solução?

\n\n

No Android, um Intent é uma mensagem que diz ao sistema: "Ei, preciso fazer algo com tal ação". Para iniciar uma Activity de outro aplicativo, existem duas abordagens:

\n\n
    \n
  • Intent Explícito — você sabe exatamente qual componente deseja iniciar (ex.: com.example.target.MainActivity). Funciona apenas se você tiver acesso ao código desse aplicativo.
  • \n
  • Intent Implícito — você descreve o que deseja fazer (ex.: "abrir um mapa com coordenadas"), e o sistema encontra o aplicativo adequado. Essa é a forma mais flexível e segura para chamar uma Activity externa.
  • \n
\n\n

Vamos focar nos Intents implícitos, pois são os mais usados para comunicação entre aplicativos Android.

\n\n

Exemplo básico: abrindo um mapa com coordenadas

\n\n

Vamos começar com um exemplo simples que mostra como iniciar uma Activity de outro aplicativo para exibir um mapa.

\n\n
// Kotlin\nval gmmIntentUri = Uri.parse("geo:-23.5505,-46.6333?z=15")\nval mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)\nmapIntent.setPackage("com.google.android.apps.maps")\n\n// Verifica se existe um app que pode processar o Intent\nif (mapIntent.resolveActivity(packageManager) != null) {\n    startActivity(mapIntent)\n} else {\n    // Exibe uma mensagem de erro para o usuário\n    Toast.makeText(this, "Google Maps não está instalado", Toast.LENGTH_SHORT).show()\n}
\n\n

O que acontece aqui? Criamos um Intent com a ação ACTION_VIEW e uma URI contendo as coordenadas. Em seguida, usamos setPackage para especificar que queremos usar o Google Maps (embora isso seja opcional — o sistema pode oferecer uma escolha). O mais importante é a verificação com resolveActivity. Isso evita travamentos caso o aplicativo necessário não esteja instalado no dispositivo.

\n\n

Cenário: chamando a câmera e obtendo o resultado

\n\n

Agora, vamos para um caso mais complexo — iniciar uma Activity de outro aplicativo aguardando um resultado. O exemplo clássico: tirar uma foto e recebê-la no seu app.

\n\n
// Kotlin\nprivate const val REQUEST_IMAGE_CAPTURE = 1\n\nprivate fun dispatchTakePictureIntent() {\n    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)\n    // Verifica se a câmera está disponível\n    if (takePictureIntent.resolveActivity(packageManager) != null) {\n        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)\n    } else {\n        // Tratamento de erro: câmera não encontrada\n    }\n}\n\noverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n    super.onActivityResult(requestCode, resultCode, data)\n    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {\n        val imageBitmap = data?                

Blogs

Book Recommendations