Introdução: por que chamar uma Activity de outro aplicativo?
\n\nImagine 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\nEssa é 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.
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\nO que é Intent e por que é a chave para a solução?
\n\nNo 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
Vamos focar nos Intents implícitos, pois são os mais usados para comunicação entre aplicativos Android.
\n\nExemplo básico: abrindo um mapa com coordenadas
\n\nVamos 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\nO 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.
Cenário: chamando a câmera e obtendo o resultado
\n\nAgora, 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?