| Permissões | Descrição |
|---|---|
ACCESS_BACKGROUND_LOCATION | Permite o acesso à localização em segundo plano. |
ACCESS_COARSE_LOCATION | Permite o acesso à localização aproximada. |
ACCESS_FINE_LOCATION | Permite o acesso à localização precisa. |
ACCESS_MEDIA_LOCATION | Permite o acesso a qualquer localização geográfica armazenada na coleção compartilhada do usuário. |
ACCESS_NETWORK_STATE | Permite o acesso a informações sobre redes. |
ACCESS_WIFI_STATE | Permite o acesso a informações sobre redes Wi-Fi. |
BATTERY_STATS | Permite que o aplicativo colete estatísticas da bateria. |
BLUETOOTH | Permite que o aplicativo se conecte a dispositivos Bluetooth pareados. |
BLUETOOTH_ADMIN | Permite que o aplicativo descubra e pareie dispositivos Bluetooth. |
BROADCAST_STICKY | Permite que o aplicativo transmita intents "sticky". |
CAMERA | Permite o acesso ao dispositivo de câmera. |
FLASHLIGHT | Permissão de lanterna obsoleta - Coberta pela permissão de CÂMERA. |
FOREGROUND_SERVICE | Permite que o aplicativo use Service.startForeground. |
GET_ACCOUNTS | Permite o acesso à lista de contas no Serviço de Contas. |
INTERNET | Permite que o aplicativo abra sockets de rede. |
READ_EXTERNAL_STORAGE | Permite que o aplicativo leia o armazenamento externo. |
READ_PHONE_STATE | Permite acesso somente à leitura ao estado do telefone, incluindo informações da rede celular atual, o status de qualquer chamada em andamento e uma lista de qualquer PhoneAccounts registrados no dispositivo. |
RECEIVE_BOOT_COMPLETED | Permite que o aplicativo receba o Intent.ACTION_BOOT_COMPLETED que é transmitido após o sistema terminar de inicializar. |
RECORD_AUDIO | Permite que o aplicativo grave áudio. |
SET_ALARM | Permite que o aplicativo transmita um Intent para definir um alarme para o usuário. |
USE_BIOMETRIC | Permite que o aplicativo use modalidades biométricas suportadas pelo dispositivo. |
USE_FINGERPRINT | Esta permissão foi descontinuada no nível de API 28. Os aplicativos devem solicitar USE_BIOMETRIC em vez disso. |
VIBRATE | Permite o acesso ao recurso de vibração. |
WAKE_LOCK | Permite o uso de PowerManager WakeLocks para manter o processador ativo ou a tela acesa. |
WRITE_EXTERNAL_STORAGE | Permite que o aplicativo escreva no armazenamento externo. |
testOnly no arquivo AndroidManifest.xml.WebView, mas o terminal é compatível com a versão 123.0.6312.0.| Permission | Description |
|---|---|
| ACCESS_BACKGROUND_LOCATION | Allows access to location in the background. |
| ACCESS_COARSE_LOCATION | Allows access to approximate location. |
| ACCESS_FINE_LOCATION | Allows access to precise location. |
| ACCESS_MEDIA_LOCATION | Allows access to any geographic locations persisted in the user's shared collection. |
| ACCESS_NETWORK_STATE | Allows access to information about networks. |
| ACCESS_WIFI_STATE | Allows access to information about Wi-Fi networks. |
| BATTERY_STATS | Allows the app to collect battery statistics. |
| BLUETOOTH | Allows the app to connect to paired Bluetooth devices. |
| BLUETOOTH_ADMIN | Allows the app to discover and pair Bluetooth devices. |
| BROADCAST_STICKY | Allows the app to broadcast sticky intents. |
| CAMERA | Allows access to the camera device. |
| FLASHLIGHT | Deprecated flashlight permission - Covered by CAMERA. |
| FOREGROUND_SERVICE | Allows the app to use Service.startForeground. |
| GET_ACCOUNTS | Allows access to the list of accounts in the Accounts Service. |
| INTERNET | Allows the app to open network sockets. |
| READ_EXTERNAL_STORAGE | Allows the app to read from external storage. |
| READ_PHONE_STATE | Allows read-only access to phone state, including the current cellular network information, the status of any ongoing calls, and a list of any PhoneAccounts registered on the device. |
| RECEIVE_BOOT_COMPLETED | Allows the app to receive the Intent.ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. |
| RECORD_AUDIO | Allows the app to record audio. |
| SET_ALARM | Allows the app to broadcast an Intent to set an alarm for the user. |
| USE_BIOMETRIC | Allows the app to use device-supported biometric modalities. |
| USE_FINGERPRINT | This permission was deprecated in API level 28. Apps should request USE_BIOMETRIC instead. |
| VIBRATE | Allows access to the vibration feature. |
| WAKE_LOCK | Allows using PowerManager WakeLocks to keep the processor from sleeping or the screen from dimming. |
| WRITE_EXTERNAL_STORAGE | Allows the app to write to external storage. |
https://portal.ifood.com.br/make-payment?content={conteudo_base64}content deve ser um JSON codificado em Base64, conforme o contrato abaixo:{
"paymentMethod": "DEBIT", //STRING – DEBIT OR CREDIT OR PIX OR VOUCHER
"value": 2000, //INTEIRO – VALOR EM CENTAVOS
"transactionId": "", //STRING ID DA TRANSAÇÃO (PARA FINS DE CONTROLE)
"tableId": "", //STRING NÚMERO DE MESA QUE ESTÁ TRANSACIONANDO
"printReceipt": true, //BOOLEAN QUE DEFINE A IMPRESSÃO OU NÃO DO COMPROVANTE
"urlToReturn": "", //NULLABLE
"sendResultInSameIntent": false, //BOOLEAN QUE DEFINE SE O RETONRO PARA O APP SERÁ VIA UMA NOVA INTENT OU VIA INTENT RESULT
"phoneNumber": null //NULLABLE
}DEBIT, CREDIT, PIX, VOUCHER.2000.https://anota.ai/payment-result?result= ➔ Aqui é definido o deeplink que o APP da Maquinona irá chamar quando finalizar a transação. No exemplo acima, o dentro do result será enviado um JSON em Base64 com as informações definidas via contrato.https://portal.ifood.com.br/make-payment?content=eyAicGF5bWVudE1ldGhvZCI6ICJERUJJVCIsICJ2YWx1ZSI6IDIwMDAwLCAidHJhbnNhY3Rpb25JZCI6ICJ0cmFuc2FjdGlvbklkUmV0b3JuYWRvIiwgInRhYmxlSWQiOiAidGFibGVJZCIsICJwcmludFJlY2VpcHQiOiB0cnVlLCAidXJsVG9SZXR1cm4iOiAiaHR0cHM6Ly9hbm90YS5haS5jb20uYnIvcGF5bWVudC1yZXN1bHQ/cmVzdWx0PSIsICJzZW5kUmVzdWx0SW5TYW1lSW50ZW50IjogZmFsc2V9{
"paymentMethod": "DEBIT",
"value": 20000,
"transactionId": "transactionIdRetornado",
"tableId": "tableId",
"printReceipt": true,
"urlToReturn": "https://anota.ai.com.br/payment-result?result=",
"sendResultInSameIntent": false,
"phoneNumber": "11976212083"
}urlToReturn, enviando um JSON em Base64 com o resultado da transação:{
"transactionIdAnotaAi": "", //STRING ID DA TRANSAÇÃO DO ANOTA AI
"tableIdAnotaAi": "", //STRING NÚMERO DE MESA QUE ESTÁ TRANSACIONANDO
"transactionIdAdyen": "", //nullable
"status": "", //STRING - SUCCESS OR ERROR
"deviceSerialNumber": "000158224211090",
"cardBrand": "", //STRING - BANDEIRA DO CARTÃO UTILIZADO PARA REALIZAR O PAGAMENTO
"errorReason": "", //STRING - RAZÃO DO POSSÍVEL ERRO DA TRANSAÇÃO
"transactionDate": "09-06-2025",
"transactionTime": "20:03:34",
"authCode": "123456",
"nsu": "S6281CZJ4MA3GCVA",
"subsidyInformation": [
{
"subsidyType": "IFOOD",
"discountInCents": 1500
}
]
}transactionId.tableId.SUCCESS ou ERROR.subsidyType: IFOOD, MERCHANT ou null. Em um futuro próximo o valor total do desconto poderá ser dividido por mais de uma origem.https://anota.ai/payment-result?result=eyJ0cmFuc2FjdGlvbklkQW5vdGFBaSI6InRyYW5zYWN0aW9uSWRBbm90YUFpIiwidGFibGVJZEFub3RhQWkiOiJ0YWJsZUlkQW5vdGFBaSIsInRyYW5zYWN0aW9uSWRBZHllbiI6IjFjNzRmMGU1LTNmNTctNGI4Ni05MGMxLTlkZjZmZmM4YmE3ZiIsInN0YXR1cyI6IlNVQ0NFU1MiLCAiZGV2aWNlU2VyaWFsTnVtYmVyIjogIjAwMDE1ODIyNDIxMTA5MCIsICJjYXJkQnJhbmQiOiAiTUMiLCAiZXJyb3JSZWFzb24iOiBudWxsfQ=={
"transactionIdAnotaAi": "transactionIdAnotaAi",
"tableIdAnotaAi": "tableIdAnotaAi",
"transactionIdAdyen": "1c74f0e5-3f57-4b86-90c1-2f6ffc8ba7f",
"status": "SUCCESS",
"deviceSerialNumber": "000158224211090",
"cardBrand": "MC",
"errorReason": null
}https://portal.ifood.com.br/make-refund?content={conteudo_base64}
content deve ser um JSON codificado em Base64, conforme o contrato abaixo:{
"transactionIdAdyen": "125a0b07-160c-4365-b687-e3b8136851fd", //STRING
"printReceipt": true, //BOOLEAN QUE DEFINE A IMPRESSÃO OU NÃO DO COMPROVANTE
"urlToReturn": "https://anota.ai/refund-result?result=", //STRING
"sendResultInSameIntent": false //BOOLEAN QUE DEFINE SE O RETONRO PARA O APP SERÁ VIA UMA NOVA INTENT OU VIA INTENT RESULT
}https://anota.ai/refund-result?result= → Aqui é definido o deeplink que o APP da Maquinona irá chamar quando finalizar o estorno. No exemplo acima, o dentro do result será enviado um JSON em Base64 com as informações definidas via contrato.https://portal.ifood.com.br/make-refund?content=eyJ0cmFuc2FjdGlvbklkQWR5ZW4iOiIxMjVhMGIwNy0xNjBjLTQzNjUtYjY4Ny1lM2I4MTM2ODUxZmQiLCJwcmludFJlY2VpcHQiOnRydWUsInVybFRvUmV0dXJuIjoiaHR0cHM6Ly9hbm90YS5haS9yZWZ1bmQtcmVzdWx0P3Jlc3VsdD0iLCAic2VuZFJlc3VsdEluU2FtZUludGVudCI6IGZhbHNlfQ=={
"transactionIdAdyen": "125a0b07-160c-4365-b687-e3b8136851fd",
"printReceipt": true,
"urlToReturn": "https://anota.ai/refund-result?result=",
"sendResultInSameIntent": false
}urlToReturn, enviando um JSON em Base64 com o resultado da transação:{
"status": "", //STRING - SUCCESS OR ERROR
"deviceSerialNumber": "000158224211090"
}SUCCESS ou ERROR.https://anota.ai/refund-result?result=eyJzdGF0dXMiOiAiU1VDQ0VTUyIsICJkZXZpY2VTZXJpYWxOdW1iZXIiOiAiMDAwMTU4MjI0MjExMDkwIn0={
"status": "SUCCESS",
"deviceSerialNumber": "000158224211090"
}https://portal.ifood.com.br/print-local?content={conteudo_base64}{
"integrationApp": "integrationApp", //STRING
"filePath": "", //STRING
"urlToReturn": "https://anota.ai/print-result?result=", //STRING
"sendResultInSameIntent": false //BOOLEAN QUE DEFINE SE O RETONRO PARA O APP SERÁ VIA UMA NOVA INTENT OU VIA INTENT RESULT
}integrationApp: Nome da empresa/integrador que está chamando a Maquinona.urlToReturn: Endereço para onde o app da Maquinona redirecionará após concluir a impressão (não “estorno”). O retorno envia um payload no parâmetro result.https://anota.ai/print-result?result= → Aqui é definido o deeplink que o APP da Maquinona irá chamar quando finalizar o estorno. Formato do result: JSON Base64 URL-safe (sem +//, de preferência sem padding).sendResultInSameIntent: Define se o retorno para o APP que está chamando será via Intent Result.filePath: Path do arquivo que o APP da Maquinona irá abrir para poder fazer a impressão.res/xml/file_paths.xml<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Expõe a pasta de arquivos internos -->
<files-path name="shared" path="." />
</paths>FileProvider no AndroidManifest.xml<application ...>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application> private fun createFile(): File {
val fileName = "fileToPrint.txt"
val fileContent = "" //BASE64 DA IMAGEM QUE DEVERÁ SER IMPRESSA
val file = File(requireContext().filesDir, "shared/$fileName")
file.parentFile?.mkdirs()
file.writeText(fileContent)
return file
}
private fun createAndSendFile() {
val file = createFile()
val fileUri: Uri = FileProvider.getUriForFile(
requireContext(),
"${requireContext().packageName}.fileprovider",
file
)
val content = PrintFileLocalModel(
urlToReturn = null,
integrationApp = "Integradora", //NOME DE SUA INTEGRADORA
sendResultInSameIntent = true,
filePath = fileUri.toString()
)
val deeplink = Uri.parse("https://portal.ifood.com.br/print-local?content=$content")
val intent = Intent(Intent.ACTION_SEND, deeplink).apply {
putExtra(Intent.EXTRA_STREAM, fileUri)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
resultLauncher.launch(intent)
}
Abaixo teremos uma descrição mais detalhada de cada uma destas etapas.https://portal.ifood.com.br/print-file?content={conteudo_base64}content deve ser um JSON codificado em Base64, conforme o contrato abaixo:{
"integrationApp": "integrationApp", //STRING
"urlToReturn": "https://anota.ai/print-result?result=", //STRING
"sendResultInSameIntent": false //BOOLEAN QUE DEFINE SE O RETONRO PARA O APP SERÁ VIA UMA NOVA INTENT OU VIA INTENT RESULT
}https://anota.ai/print-result?result= → Aqui é definido o deeplink que o APP da Maquinona irá chamar quando finalizar o estorno. No exemplo acima, o dentro do result será enviado um JSON em Base64 com as informações definidas via contrato.https://portal.ifood.com.br/print-file?content=eyJpbnRlZ3JhdGlvbkFwcCI6IkFub3RhQWkiLCJ1cmxUb1JldHVybiI6Imh0dHBzOi8vYW5vdGEuYWkvcHJpbnQtYXV0aG9yaXphdGlvbj9yZXN1bHQ9IiwgInNlbmRSZXN1bHRJblNhbWVJbnRlbnQiOiBmYWxzZX0={
"integrationApp": "AnotaAi",
"urlToReturn": "https://anota.ai/refund-result?result=",
"sendResultInSameIntent": false
}urlToReturn, enviando um JSON em Base64 com o resultado da transação:{
"status": "", //STRING - SUCCESS OR ERROR
"hash": "token",
"createAt": "2025-03-23 18:13:51.070184",
"deviceSerialNumber": "000158224211090"
}https://anota.ai/print-authorization?result=eyJzdGF0dXMiOiJTVUNDRVNTIiwiaGFzaCI6IjBmMDA2ZmIzNjRlMDY1NmExMDE4ZDMyZmRhZjQwYmMxOWMzOTZlYjE3YTE5ODc2NTAxZDcyNzExYzdlNGQxZjMiLCJjcmVhdGVBdCI6ICIyMDI1LTAzLTIzIDE4OjEzOjUxLjA3MDE4NCIsICJkZXZpY2VTZXJpYWxOdW1iZXIiOiIwMDAxNTgyMjQyMTEwOTAifQ=={
"status": "SUCCESS",
"hash": "0f006fb364e0656a1018d32fdaf40bc19c396eb17a19876501d72711c7e4d1f3",
"createAt": "2025-03-23 18:13:51.070184",
"deviceSerialNumber": "000158224211090"
}POST:
https://movilepay-api.ifood.com.br/ifoodpay/mobile/api/v1/print/file{
"authorizationHash": "TOKEN", //STRING
"contentBase64": "IMAGEM EM BASE 64" //STRING
}
Documentação sobre padrão de impressão da Adyen → Padrão de impressão da Adyen integracaoifoodpago@ifood.com.br ou acesse o portal de ajuda. integracaoifoodpago@ifood.com.br ou acesse o portal de ajuda.addJavascriptInterface).setWebContentsDebuggingEnabled).android:exported=\"true\").ex: signature, signatureOrSystem) (<permission[\\s\\S]*android:protectionLevel=\")android:debuggable=\"true\".CN=Android Debug, META-INF/.\.RSA, META-INF/.\.DSA)android:allowBackup=\"false\").SharedPreferences.*MODE).SQLiteDatabase\\.openOrCreateDatabase).Intent\\(.*\\))assets/.*\\.pem.