package [Link].
protheus
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
class MainActivity : AppCompatActivity() {
lateinit var webView: WebView
lateinit var downloadManager: DownloadManager
var downloadId: Long = -1
private var apkUri: Uri? = null
@SuppressLint("NewApi", "UnspecifiedRegisterReceiverFlag")
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
// Remover a ActionBar, garantindo que a WebView ocupe toda a tela
supportActionBar?.hide()
setContentView([Link].activity_main)
// Inicializando a WebView
webView = findViewById([Link])
// Configurações da WebView
[Link] = true // Ativa o JavaScript
[Link] = true // Habilita o armazenamento local
[Link] = WebViewClient() // Garante que os links sejam
abertos dentro da WebView
// Adiciona um listener de download
[Link] { url, _, _, _, _ ->
// Verifica se a URL é de um APK
if ([Link](".apk")) {
startDownload(url)
} else {
[Link](this, "Link de download não é um APK",
Toast.LENGTH_SHORT).show()
}
}
// Carregar a URL inicial pela API
carregarUrlDaApi()
// Registrar o BroadcastReceiver para monitorar o fim do download
val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
val onDownloadComplete = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val id = intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -
1)
if (downloadId == id) {
// Verifica se o APK foi baixado corretamente
val apkUri =
[Link](getExternalFilesDir(null)?.resolve("downloaded_apk.apk"))
// Chama o método para iniciar a instalação
startInstall(apkUri)
}
}
}
registerReceiver(onDownloadComplete, filter)
}
// Função para carregar a URL da API
private fun carregarUrlDaApi() {
Thread {
try {
// Fazendo uma requisição HTTP à API para pegar a URL
val client = OkHttpClient()
val request = [Link]()
.url("[Link] // URL
da API
.build()
val response: Response = [Link](request).execute()
val responseBody = [Link]?.string()
// Se a API retornar uma URL válida, usamos ela
if (responseBody != null && [Link]()) {
val urlInicial = responseBody
runOnUiThread {
[Link](urlInicial) // Carrega a URL no WebView
}
} else {
runOnUiThread {
[Link](this, "Erro ao obter a URL da API",
Toast.LENGTH_SHORT).show()
}
}
} catch (e: Exception) {
[Link]()
runOnUiThread {
[Link](this, "Erro na conexão com a API",
Toast.LENGTH_SHORT).show()
}
}
}.start()
}
// Função para iniciar o download do APK
private fun startDownload(url: String) {
val request = [Link]([Link](url))
.setTitle("APK Download")
.setDescription("Baixando APK...")
.setNotificationVisibility([Link].VISIBILITY_VISIBLE_N
OTIFY_COMPLETED)
.setDestinationInExternalFilesDir(this, null, "downloaded_apk.apk")
downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as
DownloadManager
downloadId = [Link](request)
[Link](this, "Iniciando download...", Toast.LENGTH_SHORT).show()
}
// Função para verificar a permissão de fontes desconhecidas
private fun checkUnknownSourcesPermission(): Boolean {
return if ([Link].SDK_INT >= Build.VERSION_CODES.O) {
// Verifica se o usuário permitiu instalar apps de fontes desconhecidas
[Link]()
} else {
true // Permissão de fontes desconhecidas era uma configuração global
antes do Android 8.
}
}
// Função para solicitar permissão para fontes desconhecidas
private fun requestUnknownSourcesPermission() {
val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
[Link] = [Link]("package:$packageName")
startActivityForResult(intent, 1234) // Aguardar a resposta do usuário
}
// Função para iniciar a instalação do APK
private fun startInstall(apkUri: Uri?) {
if (apkUri == null) {
[Link](this, "Erro ao localizar o APK para instalação.",
Toast.LENGTH_SHORT).show()
return
}
// Verificar permissão para fontes desconhecidas (Android 8+)
if (!checkUnknownSourcesPermission()) {
// Solicitar permissão para fontes desconhecidas
[Link](this)
.setTitle("Permitir Instalação")
.setMessage("Para instalar este aplicativo, permita a instalação de
fontes desconhecidas nas configurações.")
.setPositiveButton("OK") { _, _ ->
// Direciona para as configurações de fontes desconhecidas
requestUnknownSourcesPermission()
}
.setNegativeButton("Cancelar", null)
.show()
} else {
// Se já tem permissão, exibe o diálogo de instalação
showInstallDialog(apkUri)
}
}
// Função para mostrar o diálogo de instalação do APK
private fun showInstallDialog(apkUri: Uri) {
[Link](this)
.setTitle("Instalar APK")
.setMessage("Deseja instalar o aplicativo agora?")
.setPositiveButton("Sim") { _, _ ->
// Abrir o local onde o APK foi salvo para instalação
val file = File([Link])
val intent = Intent(Intent.ACTION_VIEW)
[Link](
[Link](this, "$[Link]",
file),
"application/[Link]-archive"
)
[Link] = Intent.FLAG_ACTIVITY_NEW_TASK
[Link](Intent.FLAG_GRANT_READ_URI_PERMISSION) // Permissão
de leitura
startActivity(intent)
}
.setNegativeButton("Não") { _, _ ->
finish() // Ou redirecionar para a tela inicial do app
}
.show()
}
// A função que lida com a resposta da permissão
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
{
[Link](requestCode, resultCode, data)
if (requestCode == 1234) {
// Verificar a permissão novamente
if (checkUnknownSourcesPermission()) {
val apkUri =
[Link](getExternalFilesDir(null)?.resolve("downloaded_apk.apk"))
showInstallDialog(apkUri!!)
} else {
[Link](this, "Permissão de fontes desconhecidas não foi
concedida.", Toast.LENGTH_SHORT).show()
}
}
}
// A função que lida com o BroadcastReceiver e encerra o registro
override fun onDestroy() {
[Link]()
// Certifique-se de desregistrar o receiver quando a Activity for destruída
val onDownloadComplete = null
unregisterReceiver(onDownloadComplete)
}
}