Estou tentando desenvolver um aplicativo que evita que um usuário acesse um aplicativo específico sem uma senha. O cenário é ...
- o usuário clica no aplicativo "Email" (por exemplo)
- meu aplicativo detecta o lançamento de um aplicativo
- meu aplicativo confirma que é o aplicativo "Email"
- meu aplicativo abre uma visualização por cima, pedindo uma senha
- o usuário insere uma senha, se correto, meu aplicativo desaparece, deixando o aplicativo "Email" no topo
Eu estou bem fazendo o resto, apenas a parte 2 está me intrigando, e depois de muitos dias lendo Broadcast Intents etc e tentando ouvir "android.intent.action.MAIN" etc em meus projetos de teste, não consigo parecem detectar quando um aplicativo diferente do meu é iniciado.
Alguém pode ajudar? Estou fazendo isso da maneira certa, ao procurar novos aplicativos que transmitam uma intenção de iniciar, ou devo ler o log do sistema para novas intenções ou fazer algo em código nativo?
Qualquer sugestão ajudaria, mesmo que você não possa respondê-la totalmente, poderei fazer mais pesquisas. Muito obrigado. Ian
Respostas:
Acho que podemos usar
logcat
e analisar sua saída.Em todos os programas semelhantes, encontrei esta permissão:
android.permission.READ_LOGS
Isso significa que todos eles o usam, mas parece que o programa inicia e depois disso nosso programa (protetor de aplicativo) vai iniciar e trazer para frente.
Use o código abaixo:
E não se esqueça de adicionar sua permissão no arquivo Manifest.
fonte
Uma maneira enganosa de fazer isso é ter um serviço com um loop cronometrado que verifica
Você percorre essa lista para ver o que está rodando no telefone. Agora você pode identificá-los com ids e processName, portanto, para atividades padrão, isso é fácil para os personalizados, a menos que você os interrompa, é difícil discriminar ...
Nota: esta não é uma lista do que está realmente na tela, apenas uma lista do que está sendo executado ... meio que anulando seu objetivo, talvez, mas pelo menos você saberá quando algo está começando a funcionar ... continuará sendo lista mesmo quando em segundo plano.
Para a questão da senha, você pode simplesmente iniciar sua atividade quando encontrar um aplicativo protegido ou qualquer outra coisa.
fonte
android.app.usage
pacote. developer.android.com/reference/android/app/usage/…Eu acho e espero que isso não seja possível. Considere a facilidade com que tal funcionalidade pode ser abusada por software malicioso. Você pode ouvir as intenções direcionadas a você e as que são transmitidas, mas o lançamento do aplicativo não deve ser um evento de transmissão.
O que você pode fazer é substituir o inicializador . Se o usuário concordar com isso.
fonte
Você pode obter o funcionamento atual
Activity
e verificar se issoActivity
corresponde aoEmail
aplicativo.Execute
CheckRunningActivity
Thread
naApplication
inicialização (ou na inicialização do dispositivo).Atualização: esta classe precisa de
android.permission.GET_TASKS
permissão, então adicione a próxima linha ao Manifesto:fonte
Looper.loop()
instrução parece que nunca será executada porque owhile(true)
loop nunca termina. Isso é um erro?O principal problema é que você está tentando ouvir intents implícitos quando o Launcher (tela inicial) normalmente usa intents explícitos.
Um intent implícito é quando você quer dizer "Alguém reproduz este vídeo" e o Android escolhe um aplicativo que pode lidar com esse intent.
Uma intenção explícita é o que acontece quando você clica no ícone "E-mail" na tela inicial. Ele diz especificamente ao Android para abrir esse aplicativo específico com um nome totalmente qualificado (ou seja, com.android.mail ou algo assim).
Não há como a AFAIK interceptar tais intenções explícitas. É uma medida de segurança integrada ao Android que duas atividades não podem ter o mesmo nome de pacote totalmente qualificado. Isso evita que terceiros clonem o aplicativo e se mascarem como esse aplicativo. Se o que você deseja fazer fosse possível, você poderia teoricamente instalar um aplicativo que poderia bloquear o funcionamento de todos os aplicativos da concorrência.
O que você está tentando fazer vai contra o modelo de segurança do Android.
Uma coisa que você pode fazer é firmar parceria com desenvolvedores de aplicativos específicos para encaminhar as intenções ao seu sistema de segurança, mas provavelmente não é algo com que você queira lidar.
fonte
getRunningTasks()
está obsoleto no Android L.Para obter estatísticas de uso do aplicativo, você pode usar a classe UsageStats do pacote android.app.usage .
A nova API de estatísticas de uso de aplicativos permite que os desenvolvedores de aplicativos coletem estatísticas relacionadas ao uso dos aplicativos. Esta API fornece informações de uso mais detalhadas do que o método getRecentTasks () obsoleto.
Para usar esta API, você deve primeiro declarar a
android.permission.PACKAGE_USAGE_STATS
permissão em seu manifesto. O usuário também deve permitir o acesso a este aplicativo por meio deSettings > Security > Apps with usage access
.Aqui está um exemplo básico de aplicativo que mostra como usar a API de estatísticas de uso do aplicativo para permitir que os usuários coletem estatísticas relacionadas ao uso dos aplicativos.
fonte
Talvez você precise de um serviço, algo que será executado em segundo plano constantemente. Que seu serviço faça o que você disse. Ouça o android.intent.action.MAIN também com a categoria android.intent.category.LAUNCHER. Em seguida, faça com que o broadcast receiver substitua o método onReceive e verifique o nome do aplicativo, etc.
fonte