quarta-feira, 18 de setembro de 2013

Wake Up Android Screen

Salve galera,

Nesse posto pretendo mostrar como "acordar" a tela do Android quando necessário. Um exemplo de uso seria em uma aplicação que usa alarmes. É meio chato quando um alarme dispara no dispositivo e temos que liga-lo e desbloquear a tela para fazer alguma coisa com o alarme. Bom, aqui vou mostrar como fazer isso ao disparar o alarme, para que quando o usuário pegue o dispositivo, a tela já esteja ligada e desbloqueada. Isso tudo é muito simples. Acompanhem o código abaixo:


public class WakeUpAndroid extends Activity{


    private KeyguardManager keyguardManager;
    private PowerManager powerManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Disperta a tela
        powerManager = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
        wakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
        wakeLock.acquire();

        //Desbloqueia a tela
        keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);
        keyguardLock = keyguardManager.newKeyguardLock("TAG");
        keyguardLock.disableKeyguard();

    }

    @Override
    public void finish() {
        super.finish();
        this.release();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        this.release();
    }

    private void release(){

        keyguardLock.reenableKeyguard();

        if (this.wakeLock.isHeld()) {
            this.wakeLock.release();
        }

    }

}


Após usar o recurso temos que libera-lo, caso contrario quando o dispositivo "adormecer" não será ativado o bloqueio de tela.

Até a próxima! abrassss

sexta-feira, 6 de setembro de 2013

Recuperar PID de uma JVM especifica

Salve galera,

Já precisaram recuperar o PID de uma JVM especifica? Dependendo de como o aplicativo Java  foi iniciado, e se tivermos mais do que um aplicativo rodando, a missão se torna meio complexa e enrolada. Abaixo um código Java que identifica o PID de uma JVM especifica. Precisamos do utilitário jps do java, encontrado na pasta bin do jdk. Ao executarmos o jps, como saída temos o PID das JVM's em execução, junto com um identificador do processo, que são os argumentos passados para a JVM. Por exemplo, um Glassfish apresenta o nome ASMain ao lado do PID, enquanto o ActiveMQ apresenta o nome aqtivemq.jar ao lado do PID. Então é de responsabilidade do programa que precisa usar o recurso saber o nome gerado de antemão. Para ter essa informação é só rodar o aplicativo que se quer controlar, depois rodar o jps e ver as saidas. Abaixo um código que identifica se determinado aplicativo está sendo executado e pega seu PID



 public boolean hasJavaProcess() throws IOException {


        String glassfishProcessName = "ASMain";
        File file = new File(System.getenv("JAVA_HOME"), "bin");

        if (System.getProperty("os.name").toLowerCase().contains("windows")) {
            file = new File(file, "jps.exe");
        } else {
            file = new File(file, "jps");
        }

        String pid = null;

        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("\"" + file.getAbsolutePath() + "\"");
        InputStream in = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line = null;

        while ((line = reader.readLine()) != null) {
            if (line.contains(glassfishProcessName )) {
                pid = line.replace(glassfishProcessName , "").replace(" ", "");
                break;
            }
        }
        reader.close()
 
       return pid != null;
    }

Ah, mais uma coisa.. Para uma melhor analise dos processos Java em execução, junto do jps você pode rodar a jvisualvm, que da informações mais detalhadas sobre o que está em rodando.

Até pode parecer meio tosco deselegante, mas todas as soluções que encontrei na net eram piores, ao meu ver, pois dependiam de alguma interação com o sistema operacional, usando um ps no Linux ou o tasklist no Windows. Essa solução que criei foi bem por acaso, pois nem conhecia o jps.. mas pensei que poderia ter alguma coisa útil entre aqueles milhões de programas na pasta do sdk. E assim, solucionei o problema e fiquei bem feliz com isso! ;)

Até a próxima!

ActiveMQ Stop Windows

Salve galera,

Por padrão, quando rodamos o ActiveMQ no Windows ficamos com um prompt "pendurado" na sua execução, e ao darmos um Ctrl+C nesse prompt o shutdown do ActiveMQ é chamado. Mas e quando não temos prompt? Ou quando queremos iniciar e parar o ActiveMQ por meio de uma outra aplicação? O que se faz? Bom, como precisei disso, tive que dar uma vasculhada na documentação. Só para comentar, não precisa nem dizer que nos *nix esse problema não existe, pois já temos o start e stop por padrão no script de inicialização.

A solução para o Windows é iniciar o ActiveMQ ativando o conector jmx como no exemplo abaixo:


    

                     
                       
                    


    




Temos que adicionar o parâmetro useJmx="true" no broker e também em managementContext o parâmetro createConnector="true". Com isso podemos chamar o comando abaixo para parar o ActiveMQ no Windows, sem precisar enviar um Ctrl+C para o prompt.

activemq-admin.bat stop



Espero que ajude! Abraço

Spring Security + Container DataSource

Salve galera,

A coisa anda meio corrida e ultimamente, com isso ando meio sem tempo para escrever coisas novas aqui, mas como tudo é passageiro, até a turbulência, essa semana consegui um tempinho.

Nesse post vou dar uma dica na configuração do Spring Security. Quando usamos um banco de dados para fazer a autenticação do Spring Security precisamos informar um cada source como esse:


    
        
            
            
        
    


    
        
        
        
        
    



Isso funciona muito bem, mas se usamos um DataSource fornecido por um Container teremos a configuração do banco (driver, url, usuário, senha) em vários lugares, como no Container, no persistence.xml, no security-app-context.xml, e claro que não queremos isso. Então, para usar o DataSource do Container nas configurações do Spring Security você deve fazer o seguinte:

Primeiro, configure um bean via jndi-lookup, assim (lookup no glassfish):





E depois informe esse bean para a configuração de segurança do Spring, assim:

    
        
            
            
        
    


Rápido e rasteiro, era isso. Até a próxima!