Boa Noite a todos.
Ufa, finalemte terminei a minha aplicação móvel para o tcc, no pc ela roda tranquilamente no emulador e assim foi na apresentação, porém em um dos meus cel(Motorola V9) encontrei um problema sério. A aplicação passa por um login e entra em um menu principal, esse menu foi feito em canvas e possui icones, ao clicar no icone era para ele abrir uma lista, ou dependendo do icone ele abre um form. O problema é que loga normalmente, abre o menu, mas ao clicar no icone não abre os demais forms e nem emite uma mensagem de erro. É uma aplicação cliente que acessa um servidora(Servlets).
Abaixo a Classe de Conexão, Menu e um Form de exemplo:
[code]package Conexao;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;
/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
/**
*
-
@author Guii
*/
public class Conexao extends Thread
{
HttpConnection http=null;
DataOutputStream os=null;
DataInputStream is=null;
String url;public Conexao()
{}
public HttpConnection run(String url)
{
this.url=url;
System.out.println(url);
//Cria conexão http na url informada
try
{
http = (HttpConnection) Connector.open(url);
http.setRequestMethod(HttpConnection.POST);//envia método do pedido : POST ou GET
http.setRequestProperty(“User-Agent”,“Profile/MIDP-1.0, Configuration/CLDC-1.0”);//Informação de cabeçalho a ser enviado
http.setRequestProperty(“Content-Language”,“en-US”);} catch (IOException ex) { ex.printStackTrace(); } return http;}
public DataOutputStream Output() throws IOException
{
os =(DataOutputStream)http.openDataOutputStream();
return os;
}
public DataInputStream Input() throws IOException
{
is =(DataInputStream)http.openDataInputStream();
return is;
}
public void Close() throws IOException
{
http.close();
}
}[/code]
Menu
[code]package Forms;
import Mlearning.Mlearning;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Ticker;
public class MenuCanvas extends Canvas implements CommandListener
{
private Command detalheCommand = new Command(“Detalhe”, Command.SCREEN, 1);
private Mlearning midlet;
private Display display;
private int x, y;
private Vector opcoesVector;
private int widthIcon, heightIcon;
private int margemMenu, margemQuadrante, numQuadX, numLinhasTela, numLinhas, linhaScroll;
private Ticker user;
String username;
String usuario;
public MenuCanvas(Mlearning midlet, Display display, String username, String usuario) throws IOException
{
this.usuario=usuario;
this.midlet = midlet;
this.display = display;
this.username=username;
user=new Ticker(this.username);
this.setTicker(user);
this.addCommand(detalheCommand);
this.setCommandListener(this);
/*
Só mecher nas variaveis WidthIcon, HeightIcon, MargemQuadrante
O restante é calculado, inclusive com base nessas 3 variáveis
*/
//Tamanho do icone em pixel. Todos devem ter as mesmas dimensões.
this.widthIcon = 50;
this.heightIcon = 50;
//Margem para o icone não ficar colado
this.margemQuadrante = 2;
/*
Abaixo são os calculos de ajustagem dos icones na tela
*/
//Posicionando no inicio do menu
this.x = this.y = 0;
//Quantidade de quadrantes por linha
this.numQuadX = this.getWidth()/(this.widthIcon+(2*this.margemQuadrante));
//Numero de linhas por tela
this.numLinhasTela = this.getHeight()/(this.heightIcon+(2*this.margemQuadrante));
//Margem do menu, pra tentar centralizar o menu horizontalmente
this.margemMenu = (this.getWidth() - this.numQuadX*(this.widthIcon + (2*this.margemQuadrante)))/2;
//Iniciando vetor com as opções
this.carregaOpcoes();
//Número de linhas
if ( this.opcoesVector.size() % this.numQuadX == 0)
this.numLinhas = this.opcoesVector.size()/this.numQuadX;
else
this.numLinhas = (this.opcoesVector.size()/this.numQuadX)+1;
//Número de linhas de scroll, para visualizar opções além da tela
this.linhaScroll = 0;
}
/*
Criação dos hashtables, onde cada um dele é respectivo a uma opção do menu
*/
protected void carregaOpcoes()
{
this.opcoesVector = new Vector();
Hashtable opcaoTable;
/*
* Cada hashtable guarda as informações de uma opção:
* item: O nome do item, irá aparecer na parte superior do canvas.
* imagem: Caminho do arquivo a ser carregado como imagem do menu
* descricao: Alguma informação a mais sobre a opção, é exibido quando o usuário seleciona o comando "Detalhes".
*/
try {
opcaoTable = new Hashtable();
opcaoTable.put("item", "Cadastre-se em um curso");
opcaoTable.put("imagem", Image.createImage("/Curso.png"));
opcaoTable.put("descricao", "Curso");
opcoesVector.addElement(opcaoTable);
opcaoTable = new Hashtable();
opcaoTable.put("item", "Quiz");
opcaoTable.put("imagem", Image.createImage("/Materiais.png"));
opcaoTable.put("descricao", "Quiz");
opcoesVector.addElement(opcaoTable);
opcaoTable = new Hashtable();
opcaoTable.put("item", "Conteudo");
opcaoTable.put("imagem", Image.createImage("/Atividades.png"));
opcaoTable.put("descricao", "Exercicios");
opcoesVector.addElement(opcaoTable);
opcaoTable = new Hashtable();
opcaoTable.put("item", "Notas");
opcaoTable.put("imagem", Image.createImage("/Notas.png"));
opcaoTable.put("descricao", "Notas");
opcoesVector.addElement(opcaoTable);
opcaoTable = new Hashtable();
opcaoTable.put("item", "Colaboracao");
opcaoTable.put("imagem", Image.createImage("/mensageiro.png"));
opcaoTable.put("descricao", "Colaboracao");
opcoesVector.addElement(opcaoTable);
opcaoTable = new Hashtable();
opcaoTable.put("item", "Ajuda");
opcaoTable.put("imagem", Image.createImage("/Ajuda.png"));
opcaoTable.put("descricao", "Ajuda");
opcoesVector.addElement(opcaoTable);
opcaoTable = new Hashtable();
opcaoTable.put("item", "Alterar Senha");
opcaoTable.put("imagem", Image.createImage("/Configuracao.png"));
opcaoTable.put("descricao", "Alterar Senha");
opcoesVector.addElement(opcaoTable);
opcaoTable = new Hashtable();
opcaoTable.put("item", "Sair");
opcaoTable.put("imagem", Image.createImage("/Sair.png"));
opcaoTable.put("descricao", "Sair");
opcoesVector.addElement(opcaoTable);
} catch (Exception e) {}
}
protected void paint(Graphics g)
{
//Colocando fundo branco na tela
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
//Definindo o título a ser exibido no aplicativo
this.setTitle((String)((Hashtable)opcoesVector.elementAt((this.numQuadX*this.y)+ this.x)).get("item"));
//Desenhando quadrado que indica o item selecionado até o momento
g.setColor(35, 118, 225); //um certo tom de azul
g.fillRect((this.x*(this.widthIcon+(2*this.margemQuadrante)))+this.margemMenu,
(this.y-this.linhaScroll)*(this.heightIcon+(2*this.margemQuadrante)),
this.widthIcon+(this.margemQuadrante*2),
this.heightIcon+(this.margemQuadrante*2));
//Colocando os icones na tela
for ( int indiceY = 0; indiceY < this.numLinhas; indiceY++) {
//Se tiver scroll, não desenha a quantidade especifica
if ( indiceY < (this.linhaScroll-1) )
continue;
for ( int indiceX = 0; indiceX < this.numQuadX; indiceX++) {
//Condição de parada para a quantidade de icones
if ((this.numQuadX*indiceY)+ indiceX >= this.opcoesVector.size())
break;
//Desenhando o icone
g.drawImage((Image)((Hashtable)opcoesVector.elementAt((this.numQuadX*indiceY)+ indiceX)).get("imagem"),
((indiceX*(this.widthIcon+(2*this.margemQuadrante)))+this.margemQuadrante)+this.margemMenu,
((indiceY-linhaScroll)*(this.heightIcon+(2*this.margemQuadrante)))+this.margemQuadrante,
Graphics.TOP | Graphics.LEFT);
}
}
}
protected void keyPressed(int keyCode)
{
switch (getGameAction(keyCode)) {
case Canvas.DOWN:
if ( ++y >= this.numLinhas || (this.numQuadX*this.y)+ this.x >= this.opcoesVector.size() )
//Chegou ao final, volta para a primeira linha e zera scroll
this.linhaScroll = this.y = 0;
if ( (this.y - this.linhaScroll) >= this.numLinhasTela )
//Passou a quantidade de linhas por tela, incrementa scroll
this.linhaScroll++;
break;
case Canvas.UP:
if ( --y < 0 ) {
//Posicionando na ultima linha
y = this.numLinhas - 1;
//Verificando se na ultima linha, na coluna X existe opcao
if ( (this.numQuadX*this.y)+ this.x >= this.opcoesVector.size()) {
//Não existe opcao, voltando uma linha pra cima então
this.y--;
//Verificando a necessidade de scroll
if ( (this.y - this.linhaScroll) >= this.numLinhasTela )
this.linhaScroll++;
}
else if ( this.y >= this.numLinhasTela ) {
//Atribuindo o scroll para a ultima linha
this.linhaScroll = this.numLinhas - this.numLinhasTela;
}
} else if( this.linhaScroll > 0)
//Subindo de linha, diminuindo o scroll
this.linhaScroll--;
break;
case Canvas.RIGHT:
if ( ++x >= this.numQuadX ) {
//passou do ultimo icone da linha, zera o x
x = 0;
//Se passar da ultima linha e ultimo icone, volta para 0x0
if (++y >= this.numLinhas)
this.linhaScroll = this.y = 0;
//Passou da quantidade de linhas da tela, aumenta scroll
else if ( (this.y - this.linhaScroll) >= this.numLinhasTela )
this.linhaScroll++;
//Se tiver no ultimo elemento do menu, retorna para 0x0
}else if ((this.numQuadX*this.y) + this.x >= this.opcoesVector.size())
this.x = this.y = this.linhaScroll = 0;
break;
case Canvas.LEFT:
if ( --x < 0 ) {
//No primeiro, foi para a esquerda, direciona para o ultimo da linha
this.x = this.numQuadX - 1;
//Subindo de linha
if ( --y < 0 ) {
//Estava na primeira linha, posicionando na ultima
this.y = this.numLinhas-1;
if ( this.y >= this.numLinhasTela )
//calculando scroll
this.linhaScroll = this.numLinhas - this.numLinhasTela;
}else if (this.linhaScroll > 0){
//Subiu de linha, decrementa o scroll se existir
this.linhaScroll--;
}
//posicionando o X de acordo com o ultimo icone da linha
if ( (this.numQuadX*this.y) + this.x >= this.opcoesVector.size()) {
do {
this.x--;
} while ((this.numQuadX*this.y) + this.x >= this.opcoesVector.size());
}
}
break;
case Canvas.FIRE:
try {
//Vai para o método que executa a ação da opção selecionada
this.executarOpcao(x, y);
} catch (IOException ex) {
ex.printStackTrace();
}
break;
}
repaint();
}
private void executarOpcao(int xOpcao, int yOpcao) throws IOException
{
/*
* Nesse método é tratado o que se deseja executar.
* Para encontrar a opção correspondente no vector, use a variável
* indiceOpcao, calculada abaixo:
* int indiceOpcao = (this.numQuadX*yOpcao)+ xOpcao;
*/
String selecionado;
selecionado= (String)((Hashtable)opcoesVector.elementAt((this.numQuadX*this.y)+ this.x)).get("item");
if (selecionado.equals("Cadastre-se em um curso"))
{
Curso curso = new Curso(this,this.usuario,midlet.getPorta());
display.setCurrent(curso.frmCurso);
}
else if(selecionado.equals("Conteudo"))
{
Conteudo conteudo=new Conteudo(this, this.usuario,this.display, midlet.getPorta(),"Menu");
//display.setCurrent(conteudo.lista);
}
else if(selecionado.equals("Sair"))
{
midlet.encerrarMIDlet();
}
else if(selecionado.equals("Quiz"))
{
Conteudo conteudo=new Conteudo(this, this.usuario,this.display, midlet.getPorta(),"Quiz");
}
else if(selecionado.equals("Colaboracao"))
{
Colaboracao c = new Colaboracao(this,this.usuario,midlet.getPorta());
}
else if(selecionado.equals("Notas"))
{
Nota nota = new Nota(this, 0, usuario, 0, 0, midlet.getPorta());
Object aux=nota.ListaConteudo();
}
else if(selecionado.equals("Alterar Senha"))
{
Senha s= new Senha(this,midlet.getPorta(),this.usuario);
}
else if(selecionado.equals("Ajuda"))
{
Alert a = new Alert("");
a.setString("Para maiores informações sobre o funcionamento do Aplicativo consulte o nosso TCC no Capítulo Desenvolvimento.");
a.setTimeout(Alert.FOREVER);
display.setCurrent(a);
}
}
public void commandAction(Command command, Displayable displayable)
{
if ( command.equals(detalheCommand))
{
display.setCurrent(new Alert((String)((Hashtable)opcoesVector.elementAt((this.numQuadX*this.y)+ this.x)).get("item"),
(String)((Hashtable)opcoesVector.elementAt((this.numQuadX*this.y)+ this.x)).get("descricao"),
null,
AlertType.INFO), this);
}
else
{
try {
this.midlet.destroyApp(true);
}
catch (Exception e) {}
}
}
public void Voltar()
{
midlet.getTela().setCurrent(this);
}
public Display Tela()
{
return display;
}
}[/code]
Um dos Forms que o menu acessa:
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package Forms;
import Conexao.Conexao;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
/**
*
-
@author Guii
*/
public class Colaboracao extends Form implements CommandListener
{
Conexao conn=new Conexao();
MenuCanvas menu;
String usuario,url,msg=null, val1=null, val2=null;;
String porta;
DataInputStream is=null;
DataOutputStream os= null;
List lista2=null;
Vector v;
Conteudo c;//= new Conteudo(menu, usuario, menu.Tela(), porta,“Colaboracao”);
Object aux,aux2;
StringItem pergunta=null;
Form frmpergunta=null,frmcriar=null;
TextField txtresposta=null,txttitulo=null, txtpergunta=null;
Command cmdresp=null, cmdvoltar=null, cmdcriar=null,cmdenviar=null, cmdresolvido=null;
Date data = new Date();public Colaboracao(MenuCanvas menu, String usuario, String porta) throws IOException
{
super(“Colaboracao”);
this.menu=menu;
this.usuario=usuario;
this.porta = porta;
url = porta + “/MlearningServ/Colaboracao”;
lista2=new List(“Discussões”, List.IMPLICIT);
frmpergunta= new Form(“Ambiente Colaborativo”);
frmcriar= new Form(“Pergunte ao seus colegas”);
frmcriar.setCommandListener(this);
cmdresp=new Command(“Responder”, Command.OK, 1);
cmdvoltar= new Command(“Voltar”,Command.BACK, 1);
cmdcriar = new Command(“Criar”, Command.OK, 1);
cmdenviar = new Command(“Enviar”, Command.OK, 1);
cmdresolvido = new Command(“Resolvido”, Command.OK, 1);
c= new Conteudo(menu, usuario, menu.Tela(), porta,“Colaboracao”);
}public void ListaDiscussoes(Object aux) throws IOException
{
lista2.deleteAll();
this.aux=aux;
menu.Tela().setCurrent(lista2);
lista2.setCommandListener(this);
conn.run(url);os=conn.Output(); os.writeUTF("Lista Discussao"); os.writeUTF(String.valueOf(this.aux)); os.close(); v=new Vector(); is=conn.Input(); String codigo,discussao; while(is.available()!=0) { v.addElement(is.readUTF()); discussao=is.readUTF(); lista2.append(discussao, null); } lista2.addCommand(cmdcriar); lista2.addCommand(cmdvoltar); is.close(); conn.Close();}
public void Pergunta() throws IOException
{
frmpergunta.deleteAll();int cmd; cmd=lista2.getSelectedIndex(); aux2=v.elementAt(cmd); txtresposta=new TextField("", "", 200, TextField.ANY); conn.run(url); os=conn.Output(); os.writeUTF("Pergunta"); os.writeUTF(String.valueOf(aux2)); os.close(); is=conn.Input(); String auxp=is.readUTF(); pergunta=new StringItem(auxp, null); frmpergunta.append(pergunta); frmpergunta.append(txtresposta); frmpergunta.addCommand(cmdresp); frmpergunta.addCommand(cmdvoltar); frmpergunta.setCommandListener(this); menu.Tela().setCurrent(frmpergunta); is.close(); conn.Close(); ListaRespostas();}
public void Resposta(String stat) throws IOException
{
frmpergunta.setCommandListener(this);String aux=usuario+" responde as "+data+ ": "+txtresposta.getString(); StringItem StringItem = new StringItem(aux, null); frmpergunta.append(StringItem); menu.Tela().setCurrent(frmpergunta); conn.run(url); os=conn.Output(); os.writeUTF("Enviar Resposta"); os.writeUTF(String.valueOf(this.aux2)); os.writeUTF(aux); os.writeUTF(usuario); os.writeUTF(stat); os.close(); is=conn.Input(); msg=is.readUTF(); is.close(); conn.Close(); txtresposta.setString(""); showAlert(msg);}
public void ListaRespostas() throws IOException
{
conn.run(url);
os=conn.Output();
os.writeUTF(“Carregar Respostas”);
os.writeUTF(String.valueOf(this.aux2));
os.close();is=conn.Input(); String lresp=null; v=new Vector(); while (is.available()!=0) { lresp=is.readUTF(); StringItem StringItem = new StringItem(lresp,null); //alteração para colocguiar o comando resolver frmpergunta.append(StringItem); } is.close(); /*if(luser.equals(usuario)) { frmpergunta.addCommand(cmdresolvido); }*/ conn.Close(); menu.Tela().setCurrent(frmpergunta); Resolver();}
public void CriarDiscussao()
{
txttitulo= new TextField(“Título”,"", 70,TextField.ANY);
txtpergunta=new TextField(“Pergunta”,"", 200, TextField.ANY);
frmcriar.append(txttitulo);
frmcriar.append(txtpergunta);
frmcriar.addCommand(cmdvoltar);
frmcriar.addCommand(cmdenviar);
menu.Tela().setCurrent(frmcriar);
}
public void EnviarDiscussao() throws IOException
{conn.run(url); os=conn.Output(); os.writeUTF("Enviar Discussao"); os.writeUTF(txttitulo.getString()+" -->Por: "+usuario); os.writeUTF(String.valueOf(this.aux)); os.writeUTF(usuario+" pergunta: "+txtpergunta.getString()); os.writeUTF(usuario); os.writeUTF("Aberto"); System.out.println("aux"+String.valueOf(this.aux)); os.close(); is=conn.Input(); msg=is.readUTF(); System.out.println("A mensagem é:"+msg); is.close(); conn.Close(); lista2.deleteAll(); ListaDiscussoes(this.aux); showAlert(msg);}
public void Resolver() throws IOException
{
conn.run(url);
os=conn.Output();
os.writeUTF(“Resolver”);
os.writeUTF(String.valueOf(this.aux2));
os.close();is=conn.Input(); String luser=null; String stat=null; v=new Vector(); while (is.available()!=0) { luser=is.readUTF(); stat=is.readUTF(); } is.close(); if(luser.equals(usuario)&&stat.equals("Aberto")) { frmpergunta.addCommand(cmdresolvido); } else if(luser.equals(usuario)&&stat.equals("Resolvido")) { frmpergunta.removeCommand(cmdresp); } conn.Close();}
public void Resolvido() throws IOException
{
conn.run(url);
os=conn.Output();
os.writeUTF(“Resolvido”);
os.writeUTF(String.valueOf(this.aux2));
os.close();is=conn.Input(); String msg1=is.readUTF(); conn.Close(); ListaDiscussoes(aux);}
public void commandAction(Command c, Displayable d)
{
if(c==lista2.SELECT_COMMAND)
{
try {
Pergunta();
} catch (IOException ex) {
ex.printStackTrace();
}
}
else if(c==cmdresp)
{
val1=txtresposta.getString();
try {
if(val1.equals(""))
{
showAlert(“Digite o comentário!”);
}
else
Resposta(“Aberto”);
} catch (IOException ex) {
ex.printStackTrace();
}
}
else if(c==cmdcriar)
{
CriarDiscussao();
}
else if (c==cmdenviar)
{
val1=null;
val2=null;
val1=txttitulo.getString();
val2=txtpergunta.getString();
try {
if(val1.equals("")&&val2.equals(""))
showAlert(“Digite o título e a resposta”);
else if(val1.equals(""))
showAlert(“Digite o título!”);
else if(val2.equals(""))
showAlert(“Digite a sua pergunta”);else EnviarDiscussao(); } catch (IOException ex) { ex.printStackTrace(); } } else if((c==cmdvoltar)&&(d==frmpergunta)) { try { frmpergunta.removeCommand(cmdresolvido); ListaDiscussoes(aux); } catch (IOException ex) { ex.printStackTrace(); } } else if((c==cmdresolvido)&&(d==frmpergunta)) { try { Resposta("Resolvido"); } catch (IOException ex) { ex.printStackTrace(); } } else if((c==cmdvoltar)&&(d==lista2)) { try { Colaboracao co = new Colaboracao(menu, usuario, porta); } catch (IOException ex) { ex.printStackTrace(); } } else if((c==cmdvoltar)&&(d==frmcriar)) { try { ListaDiscussoes(aux); } catch (IOException ex) { ex.printStackTrace(); } }}
public void showAlert(String msg)
{
Alert a = new Alert("");
a.setString(msg);
a.setTimeout(Alert.FOREVER);
menu.Tela().setCurrent(a);
}
}[/code]
O cel pessoal não tem wi-fi, eu cadastrei um dns no-ip para minha máquina, assim eu posso acessar por gsm no meu servidor, a aplicação loga normalmente, ou seja eu consegui comunicação com o servidor, o problema é no menu, tem hora que abre os outros forms(raramente), o código funcionou para o pc, mas não no cel. Outro problema que ocorre sempre mas no computador, é o problema de estourar limites do socket tcp ip, ele ocorre quando eu estou navegando na aplicação após um determinado periodo, a aplicação é mais ou menos grande, então eu abro e fecho conexão sempre, acredito que os dois problemas ocorrem devido a minha má implementação da conexão, então vim aqui dividi com o pessoal =D
Até mais.