171 lines
6.5 KiB
Markdown
171 lines
6.5 KiB
Markdown
|
|
# Correção para Abertura de Aplicativos Externos no Android
|
||
|
|
|
||
|
|
## Problema Identificado
|
||
|
|
No Android, quando o usuário clicava nos botões de WhatsApp e Waze, recebia as mensagens:
|
||
|
|
- "Erro não foi possível abrir o aplicativo"
|
||
|
|
- "Erro Não foi possível abrir o WhatsApp"
|
||
|
|
|
||
|
|
## Causa do Problema
|
||
|
|
O Android 11+ introduziu restrições mais rigorosas para abrir aplicativos externos através do sistema de "Package Visibility". A partir desta versão, os apps precisam declarar explicitamente quais aplicativos externos podem ser abertos.
|
||
|
|
|
||
|
|
## Soluções Implementadas
|
||
|
|
|
||
|
|
### 1. Atualização do AndroidManifest.xml
|
||
|
|
Adicionadas as seguintes configurações no `android/app/src/main/AndroidManifest.xml`:
|
||
|
|
|
||
|
|
```xml
|
||
|
|
<!-- Permissões para abrir aplicativos externos -->
|
||
|
|
<queries>
|
||
|
|
<!-- URLs HTTPS e HTTP -->
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="https"/>
|
||
|
|
</intent>
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="http"/>
|
||
|
|
</intent>
|
||
|
|
|
||
|
|
<!-- Protocolos específicos -->
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="whatsapp"/>
|
||
|
|
</intent>
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="waze"/>
|
||
|
|
</intent>
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="tel"/>
|
||
|
|
</intent>
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="telprompt"/>
|
||
|
|
</intent>
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="geo"/>
|
||
|
|
</intent>
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="maps"/>
|
||
|
|
</intent>
|
||
|
|
<intent>
|
||
|
|
<action android:name="android.intent.action.VIEW"/>
|
||
|
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||
|
|
<data android:scheme="intent"/>
|
||
|
|
</intent>
|
||
|
|
|
||
|
|
<!-- Pacotes específicos -->
|
||
|
|
<package android:name="com.whatsapp"/>
|
||
|
|
<package android:name="com.waze"/>
|
||
|
|
<package android:name="com.google.android.apps.maps"/>
|
||
|
|
</queries>
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Melhoria nas Funções de Abertura de Apps
|
||
|
|
|
||
|
|
#### WhatsApp (`openWhatsApp`)
|
||
|
|
- **URLs mais abrangentes**: Adicionadas múltiplas variações de URLs
|
||
|
|
- **Protocolos alternativos**: Incluídos `intent://` para Android
|
||
|
|
- **Fallback para Play Store**: Se o app não estiver instalado, oferece instalação
|
||
|
|
- **Timeout**: Implementado timeout de 5 segundos para evitar travamentos
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
const whatsappUrls = [
|
||
|
|
// URLs com protocolo whatsapp:// (mais confiáveis)
|
||
|
|
`whatsapp://send?phone=${cleanNumber}&text=${encodeURIComponent(message)}`,
|
||
|
|
`whatsapp://send?phone=${cleanNumber.replace('+', '')}&text=${encodeURIComponent(message)}`,
|
||
|
|
|
||
|
|
// URLs com https://wa.me/ (fallback web)
|
||
|
|
`https://wa.me/${cleanNumber.replace('+', '')}?text=${encodeURIComponent(message)}`,
|
||
|
|
`https://wa.me/${cleanNumber}?text=${encodeURIComponent(message)}`,
|
||
|
|
|
||
|
|
// URLs alternativas para Android
|
||
|
|
`intent://send/${cleanNumber.replace('+', '')}#Intent;scheme=smsto;package=com.whatsapp;S.sms_body=${encodeURIComponent(message)};end`,
|
||
|
|
`intent://send/${cleanNumber}#Intent;scheme=smsto;package=com.whatsapp;S.sms_body=${encodeURIComponent(message)};end`,
|
||
|
|
|
||
|
|
// URLs com formato mais simples
|
||
|
|
`whatsapp://send?phone=${cleanNumber.replace('+', '')}`,
|
||
|
|
`whatsapp://send?phone=${cleanNumber}`,
|
||
|
|
];
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Navegação (`openNavigationApp`)
|
||
|
|
- **Múltiplas URLs por app**: Cada app de navegação tem várias opções de URL
|
||
|
|
- **Protocolos específicos**: `waze://`, `geo:`, `maps://`
|
||
|
|
- **Intent URLs**: URLs com formato `intent://` para Android
|
||
|
|
- **Fallback inteligente**: Se o app não estiver instalado, oferece instalação
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// Exemplo para Waze
|
||
|
|
urls = [
|
||
|
|
// URLs com protocolo waze:// (mais confiáveis)
|
||
|
|
`waze://?q=${encodedAddress}&navigate=yes`,
|
||
|
|
`waze://?ll=${latitude},${longitude}&navigate=yes`,
|
||
|
|
|
||
|
|
// URLs com https://waze.com/ (fallback web)
|
||
|
|
`https://waze.com/ul?q=${encodedAddress}&navigate=yes`,
|
||
|
|
`https://waze.com/ul?ll=${latitude},${longitude}&navigate=yes`,
|
||
|
|
|
||
|
|
// URLs com intent:// para Android
|
||
|
|
`intent://waze.com/ul?q=${encodedAddress}&navigate=yes#Intent;scheme=https;package=com.waze;end`,
|
||
|
|
`intent://waze.com/ul?ll=${latitude},${longitude}&navigate=yes#Intent;scheme=https;package=com.waze;end`,
|
||
|
|
];
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Tratamento de Erros Melhorado
|
||
|
|
- **Timeout**: Implementado timeout de 5 segundos para evitar travamentos
|
||
|
|
- **Fallback para Play Store**: Se o app não estiver instalado, oferece instalação
|
||
|
|
- **Logs detalhados**: Logs para debug de cada tentativa
|
||
|
|
- **Alertas informativos**: Mensagens claras para o usuário
|
||
|
|
|
||
|
|
### 4. Correção de Linter
|
||
|
|
- **Propriedades faltantes**: Adicionadas `latFrom` e `lngFrom` no tipo `Delivery`
|
||
|
|
- **Compatibilidade**: Garantida compatibilidade com a interface `Delivery`
|
||
|
|
|
||
|
|
## Como Testar
|
||
|
|
|
||
|
|
### 1. Build de Produção
|
||
|
|
```bash
|
||
|
|
npx expo run:android --variant release
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Cenários de Teste
|
||
|
|
- **WhatsApp instalado**: Deve abrir o WhatsApp com a mensagem
|
||
|
|
- **WhatsApp não instalado**: Deve oferecer instalação na Play Store
|
||
|
|
- **Waze instalado**: Deve abrir o Waze com a rota
|
||
|
|
- **Waze não instalado**: Deve oferecer instalação na Play Store
|
||
|
|
- **Google Maps**: Deve abrir o Google Maps com a rota
|
||
|
|
|
||
|
|
### 3. Logs de Debug
|
||
|
|
Os logs detalhados ajudarão a identificar qual URL funcionou:
|
||
|
|
```
|
||
|
|
=== DEBUG: ABRINDO WHATSAPP ===
|
||
|
|
Número original: +55 91 99999-9999
|
||
|
|
Número formatado: +5591999999999
|
||
|
|
URLs para tentar: [...]
|
||
|
|
Tentativa 1: whatsapp://send?phone=+5591999999999&text=...
|
||
|
|
URL 1 suportada: whatsapp://send?phone=+5591999999999&text=...
|
||
|
|
```
|
||
|
|
|
||
|
|
## Compatibilidade
|
||
|
|
- ✅ Android 11+
|
||
|
|
- ✅ Android 10 e anteriores
|
||
|
|
- ✅ iOS (mantida compatibilidade)
|
||
|
|
- ✅ Expo SDK 53
|
||
|
|
|
||
|
|
## Referências
|
||
|
|
- [Android Package Visibility](https://developer.android.com/training/package-visibility)
|
||
|
|
- [React Native Linking](https://reactnative.dev/docs/linking)
|
||
|
|
- [WhatsApp Business API](https://developers.facebook.com/docs/whatsapp/cloud-api/reference/phone-numbers)
|
||
|
|
- [Waze URL Scheme](https://developers.google.com/waze/deep-links)
|