>

Fórum

Fórum da RL System, voltado para analistas, programadores etc. Tudo sobre linguagem de programação e desenvolvimento Full Stack: Banco de Dados, Android, C#, Java, .NET, PHP, Node, Javascript, TypeScript, Front, HTML e muito mais.



Dúvida na replicação de dados para banco MySQL


Pessoal, segui a aula certinho, e até funcionou em um dispositivo android 2.2. PORÉM, ao executar em um dispositivo com andoid kitkat (4.4.2), obtenho o seguinte erro (e não replica de forma alguma):

06-22 13:43:40.732: W/ContextImpl(31903): Implicit intents with startService are not safe: Intent { act=br.com.uau.vendas.INIREP } android.content.ContextWrapper.startService:494 br.com.uau.vendas.MainActivity.Replicacao_Click:61 java.lang.reflect.Method.invokeNative:-2

Como resolver isso?



49 Respostas


Francisco

Era para ter funcionado. O erro não deve ser pela versão.

Veja se o celular com a versão nova possui internet. Ou se utiliza GPS, verifique se o mesmo está ativo.




Possui internet sim e o gps está ativo. Suspeito que seja devido ao uso do fragment layout, que eu não. Realmente é a única suspeita que tenho. Testei em celulares com android 2.2 e 2.3, funcionou perfeito. Mas no celular com versão 4.4.2 aparece esse erro e não funciona. Realmente estou precisando de ajuda nisso. Pode me ajudar?




Precisando muito mesmo de ajuda com este problema!!!




ola Francisco..

vc roda no emulador ou no celular??




André, já rodei em emulador 2.2 e 4.4.2 e em celular com android 2.2 e 4.4.2.
Com android 2.2 roda no emulador e no celular. Com o 4.4.2 não roda nem no celular e nem no emulador.




vc fez o q com os fragments??




Programei sem os fragments, exatamente como o exemplo dado pelo professor. Sei nem pra onde vai com esses fragments rs rs. Por sinal, em algum momento dos cursos (avançado e boas práticas) este assunto será abordado?




funcionou sem os fragments??




no android 2.2 sim. Aquele erro que mostrei só aparece no 4.4.2 (celular e emulador)




vc baixou recentemente o eclipse do site android.developer??

pq agora ta assim ... qdo tu cria o novo projeto la no eclipse ele cria um fragment p ti mas ele cria e aparece com erro... e o que eu fiz eu so fui la marquei os fragment e fui la em Project->clean e depois fui la em Project->Build Project.. ai o teu projeto e o fragment some aquele erro...




O problema do fragment foi relativamente fácil de resolver. Já consegui implementar sem eles (exatamente como nas aulas). E não está dando erro algum em tempo de compilação, além de estar funcionando sim, só não no 4.4.2. Isso realmente está me tirando o sono, pois fazer um aplicativo que roda apenas em celulares antigos é complicado.




Minha SUSPEITA é: será que para funcionar nesta versão do android será obrigatório implementar os fragments? Ou seja, a main terá de extender de ActionBarActivity? Meu código está exatamente igual ao do curso. Por sinal já testei inclusive baixar o projeto e rodar. O erro é sempre aquele que colei: 06-22 13:43:40.732: W/ContextImpl(31903): Implicit intents with startService are not safe: Intent { act=br.com.uau.vendas.INIREP } android.content.ContextWrapper.startService:494 br.com.uau.vendas.MainActivity.Replicacao_Click:61 java.lang.reflect.Method.invokeNative:-2




entaum tente fazer com os fragments




André não faço a menor ideia de como os fragments funcionam. Não tem uma aula sequer que ensina algo sobre a ActionBarActivity né?




Francisco

Não pode ser esse o erro. Só se fosse o contrário, se você tive-se utilizado fragment (nativo) e tentado rodar na 2.2

Uma aplicação 2.2 deve rodar nas demais versões acima.

Faça um simples teste. Crie uma app 2.2 sem nada, so com um TextView na Activity, e tente rodar no celular com a versão mais recente.




Já fiz esse teste, e roda sem problema. Alias, a aplicação executa no celular com android 4.4.2. Ele faz a nova venda... busca localização... lista as vendas... só aparece o erro no momento da replicação. Não estou afirmando que o erro está nos fragments, apenas estava suponto, conforme mencionei acima.

O fato é que mesmo o código fornecido pela RLSystem, executa em outros aparelhos, mas não no Xperia ZQ com android 4.4.2 (que por sinal eu tenho 2 aparelhos idênticos, um deles tirei da caixa terça feira, n tem praticamente nada instalado).

Executa todas as tarefas, mas no momento da replicação aparece o erro que postei no logcat.
Pode me ajudar?




Ola Francisco

veja esse topico aqui

http://rlsystem.com.br/forum/android/561-erro-na-replicacao-de-dados#top

depois dê o retorno p gente..




André, eu já tinha lido esse tópico.
Mas vendo em uma de suas postagens que vc havia testado o projeto de um colega no wamp, decidi fazer o teste... baixei o wamp, configurei certinho e... o celular (android 4.4.2) continua sem funcionar (mas com erro diferente), além do emulador 2.2, que antes funcionava e agora não funciona mais (erro diferente do celular, simplesmente para de executar quando entra no "if").

Segue as telas dos logs:

(erro do celular)

e
http://rlsystem.com.br/forum/disco/uploads/e207e9b41dbea4ceae602f830561f879-erro2.jpg
(erro do emulador)




Estou realmente estressado com essa replicação, pode me ajudar?




Estou realmente estressado com essa replicação, pode me ajudar?




Desculpa a mensagem replicada, cliquei sem querer e não vi que havia clicado




André, posso te enviar o projeto para que verifique e teste? Todo o resto funciona perfeitamente, implementei inclusive alguns "extras", como por exemplo uma tela inicial com login e senha. Tudo está funcionando 100% MENOS a maldita replicação!!!! rs rs rs




Francisco e André,

apenas para contribuir, estou com um problema parecido, onde estou conectando direto com o banco SQLServer na web via jtds, sei que não é recomendado, mas encontrei um código e testei.

Resultado semelhante ao aqui declarado, funciona nas versões 2.x e sem retorno na conexão nas versões 4.x

Testado em emuladores e dispositivos diversos.

Seria questão de bloqueio de conexão "insegura" pela versão 4.x ???




Ola Pessoal

sigam esse topico aqui, por favor

http://rlsystem.com.br/forum/android/561-erro-na-replicacao-de-dados#top




Andre, você já postou esse link antes...
Não resolveu, até porque são erros diferentes, BEM diferentes.
Conforme eu disse acima, vende esse topico inclusive fiz testes com o wamp.
Vou repetir Andre: Posso te enviar o projeto para que verifique? Pode me ajudar com isso? Conforme Heric disse acima, será um bloqueio das versões 4.x para conexões inseguras? Por favor nos ajude com isso.




opa Francisco.... sua duvida agora é na criacao do banco ou na replicacao??

poste aqui o seu codigo aqui pq ajuda as outras pessoas q tiverem a sua mesma duvida




foi mal... eu acabei confudidndo o outro topico com o seu...

poste aqui seu codigo...




Segue o código do ExportarVendasService:


package br.com.uau.vendas;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class ExportarVendasService extends Service implements Runnable {

public void onCreate() {
new Thread(ExportarVendasService.this).start();
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

public void run() {
SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);

Cursor cursor = db.rawQuery("SELECT * FROM vendas", null);
int totalDB = cursor.getCount();
int totalReplicado = 0;

while(cursor.moveToNext()){
StringBuilder strURL = new StringBuilder();
strURL.append("http://192.168.1.103/vendas/inserir.php?produto=");
strURL.append(cursor.getInt(cursor.getColumnIndex("produto")));
strURL.append("&preco=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("preco")));
strURL.append("&latitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("la")));
strURL.append("&longitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("lo")));
strURL.append("&cliente=");
strURL.append(cursor.getString(cursor.getColumnIndex("cliente")));
Log.d("ExportarVendasService", strURL.toString());
try{
URL url = new URL(strURL.toString());
Log.d("Replicacao",url.toString());//Pegas a url normal
HttpURLConnection http = (HttpURLConnection) url.openConnection();
Log.d("HTTP", http.getInputStream().toString());//n pega o getInputStream
InputStreamReader ips = new InputStreamReader(http.getInputStream());
Log.d("IPS", "Passou do IPS");
BufferedReader line = new BufferedReader(ips);
Log.d("BF", "Passou do BufferedReader");

String linhaRetorno = line.readLine();
Log.d("Linha Retorno",linhaRetorno);

if(linhaRetorno.equals("Y")){//le as linhas

db.delete("vendas", "_id=?", new String[]{String.valueOf(cursor.getInt(0))});
totalReplicado ;
Log.d("ExportarVendasService", "OK");
}
} catch(Exception ex){
Toast.makeText(getBaseContext(), ex.getMessage(),Toast.LENGTH_SHORT).show();
Log.d("ExportarVendasService", ex.getMessage());
}
}


NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

Notification nt = null;

if(totalDB == totalReplicado){
nt = new Notification(R.drawable.ic_launcher, "Status Replicação", System.currentTimeMillis());

nt.flags |= Notification.FLAG_AUTO_CANCEL;

PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);

nt.setLatestEventInfo(this, "Status Replicação", "A replicação foi feita com sucesso, total: " totalReplicado, p);
} else {
nt = new Notification(R.drawable.ic_launcher, "Status Replicação", System.currentTimeMillis());

nt.flags |= Notification.FLAG_AUTO_CANCEL;

PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);

nt.setLatestEventInfo(this, "Status Replicação", "A replicação não foi feita com sucesso, total: " totalReplicado " de " totalDB, p);
}

nt.vibrate = new long[]{100, 2000, 1000, 2000};

notificationManager.notify((int)Math.round(Math.random()), nt);

db.close();
}
}




Código do Main:


package br.com.uau.vendas;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);


StringBuilder sqlProdutos = new StringBuilder();
sqlProdutos.append("CREATE TABLE IF NOT EXISTS [produtos] (");
sqlProdutos.append("[_id] INTEGER PRIMARY KEY AUTOINCREMENT, ");
sqlProdutos.append("nome varchar(100), ");
sqlProdutos.append("preco DOUBLE(10,2));");
db.execSQL(sqlProdutos.toString());

db.execSQL("INSERT INTO produtos (nome, preco) VALUES ('Coca Cola', '2.50')");
db.execSQL("INSERT INTO produtos (nome, preco) VALUES ('Red Bull', '6.50')");

StringBuilder sqlVendas = new StringBuilder();
sqlVendas.append("CREATE TABLE IF NOT EXISTS [vendas] (");
sqlVendas.append("[_id] INTEGER PRIMARY KEY AUTOINCREMENT, ");
sqlVendas.append("produto INTEGER, ");
sqlVendas.append("preco DOUBLE(10,2), ");
sqlVendas.append("la DOUBLE(10,9), ");
sqlVendas.append("lo DOUBLE(10,9), ");
sqlVendas.append("cliente varchar(100)); ");
db.execSQL(sqlVendas.toString());

db.execSQL("INSERT INTO vendas (produto, preco, la, lo, cliente) VALUES ('1', '2.50', '13113', '43434', 'UHUUU')");

db.close();
}

public void NovaVenda_Click(View view) {
startActivity(new Intent(getBaseContext(), NovaVenda.class));
}

public void ListarVendas_Click(View view) {
startActivity(new Intent(getBaseContext(), ListarVendas.class));
}

public void Logout_Click(View view) {
finish();
}

public void Replicacao_Click(View view) {
final String serviceAction = "br.com.uau.vendas.INIREP";
Intent serviceIntent = new Intent(serviceAction);
startService(serviceIntent);


//startService(new Intent("br.com.uau.vendas.INIREP"));
}

}




O código do php:


mysql_connect("localhost", "root", "");
mysql_select_db("vendas");
$SQL = "INSERT INTO vendas (produto, preco, latitude, longitude, cliente)
VALUES ('".$_GET["produto"]."', '".$_GET["preco"]."', '".$_GET["latitude"]."', '".$_GET["longitude"]."', '".$_GET["cliente"]."')";
mysql_query($SQL);

if(mysql_affected_rows() > 0){
echo "Y";
} else {
echo "N";
}

?>




Se precisar de mais algum é só pedir




Ola Francisco

Olha vc baixa esse exemplo aqui

http://rlsystem.com.br/forum/disco/uploads/1643a197e1720e3e8c5760f06e04f35a-ExemploMysql.zip

ai é só ver a parte do Mysql.java e Replicar.java..
se de copie a parte do Mysql.java para seu projeto..
ai veja la no Replicar.java quais sao as partes para modificar no seu projeto




Inseri o arquivo Msql.java e efetuei as alterações no arquivo de replicação (segue o código em anexo), mas continua sem funcionar. Resolvi testar inclusive um outro projeto que eu tinha aqui (cadastro de usuários usando MySQL com script em php), bem simples, sem SQLite. Adivinha: também não funcionou nos celulares com android 4.4.2 (nem no celular real e nem no emulador), mas funcionou no emulador e celular 2.2.

Logo, realmente creio que é algum tipo de bloqueio para conexões "não seguras" desta versão do android. Só pode ser...
Estou REALMENTE precisando de ajuda com isso.

Segue o código modificado do arquivo de replicação:


package br.com.uau.vendas;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class ExportarVendasService extends Service implements Runnable {

public void onCreate() {
new Thread(ExportarVendasService.this).start();
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

public void run() {
SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);

Cursor cursor = db.rawQuery("SELECT * FROM vendas", null);
int totalDB = cursor.getCount();
int totalReplicado = 0;


while(cursor.moveToNext()){


String strURL = "http://192.168.1.103/vendas/inserir.php?produto="
cursor.getInt(cursor.getColumnIndex("produto"))
"&preco=" cursor.getDouble(cursor.getColumnIndex("preco"))
"&latitude=" cursor.getDouble(cursor.getColumnIndex("la"))
"&longitude=" cursor.getDouble(cursor.getColumnIndex("lo"))
"&cliente=" cursor.getString(cursor.getColumnIndex("cliente"));
Log.d("ExportarVendasService", strURL.toString());
try{
String resposta;
resposta = Mysql.executaHttpGet(strURL);
Log.w("MENSAGEM", resposta.toString());
Toast.makeText(getApplicationContext(), "Sucesso", Toast.LENGTH_LONG).show();
/*URL url = new URL(strURL.toString());
Log.d("Replicacao",url.toString());//Pegas a url normal
HttpURLConnection http = (HttpURLConnection) url.openConnection();
Log.d("HTTP", http.getInputStream().toString());//n pega o getInputStream
InputStreamReader ips = new InputStreamReader(http.getInputStream());
Log.d("IPS", "Passou do IPS");
BufferedReader line = new BufferedReader(ips);
Log.d("BF", "Passou do BufferedReader");

String linhaRetorno = line.readLine();
Log.d("Linha Retorno",linhaRetorno);

if(linhaRetorno.equals("Y")){//le as linhas

db.delete("vendas", "_id=?", new String[]{String.valueOf(cursor.getInt(0))});
totalReplicado ;
Log.d("ExportarVendasService", "OK");*/

} catch(Exception ex){
Toast.makeText(getBaseContext(), ex.getMessage(),Toast.LENGTH_SHORT).show();
Log.d("ExportarVendasService", ex.getMessage());
}
}


NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

Notification nt = null;

if(totalDB == totalReplicado){
nt = new Notification(R.drawable.ic_launcher, "Status Replicação", System.currentTimeMillis());

nt.flags |= Notification.FLAG_AUTO_CANCEL;

PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);

nt.setLatestEventInfo(this, "Status Replicação", "A replicação foi feita com sucesso, total: " totalReplicado, p);
} else {
nt = new Notification(R.drawable.ic_launcher, "Status Replicação", System.currentTimeMillis());

nt.flags |= Notification.FLAG_AUTO_CANCEL;

PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);

nt.setLatestEventInfo(this, "Status Replicação", "A replicação não foi feita com sucesso, total: " totalReplicado " de " totalDB, p);
}

nt.vibrate = new long[]{100, 2000, 1000, 2000};

notificationManager.notify((int)Math.round(Math.random()), nt);

db.close();
}
}




o q aparece no Log.d("ExportarVendasService", strURL.toString());????




Log após a execução:


07-01 14:05:20.281: W/ContextImpl(10505): Implicit intents with startService are not safe: Intent { act=br.com.uau.vendas.INIREP } android.content.ContextWrapper.startService:494 br.com.uau.vendas.MainActivity.Replicacao_Click:61 java.lang.reflect.Method.invokeNative:-2
07-01 14:05:20.371: I/dalvikvm(11680): Enabling JNI app bug workarounds for target SDK version 8...
07-01 14:05:20.411: D/ExportarVendasService(11680): http://192.168.1.103/vendas/inserir.php?produto=1&preco=2.5&latitude=-5.86647629&longitude=-35.18274248&cliente=jikl


Ou seja, ele passa a Url direitinho, se eu jogar essa url no navegador ele insere legal, o problema é realmente a conexão.




o q aparece la no
Log.w("MENSAGEM", resposta.toString());




O log para aí, não avança mais que isso




Andre, você já testou fazer um acesso a um banco MySQL (usando script php) usando um emulador ou celular com API 19? Qualquer tipo de acesso ao banco, em qualquer operação. O problema eu creio que está aí.




este exemplo ai funcioma

poste aqui seu android manifest.xml




Funciona com o 4.4.2?
Segue meu manifest:



package="br.com.uau.vendas"
android:versionCode="1"
android:versionName="1.0" >

android:minSdkVersion="8"
android:targetSdkVersion="8" />

android:protectionLevel="signature"/>
















android:required="true"/>


android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:name="br.com.uau.vendas.LoginActivity"
android:label="@string/app_name" >












android:value="AIzaSyANPcOciIFjJNaaK-b8LJfoeDIZmi1xyO4"/>

android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />




















Opa Francisco,

eu vou pedir p tu refazer o projeto .... pq parece ser algum bug do eclipse....

ou entao siga esse projeto aqui

http://androidhive.info/2012/05/how-to-connect-android-with-php-mysql/




Andre, mais uma vez obrigado por sua resposta. Vou tentar baixar este código e testar. Mas antes mesmo de tentar vi no vídeo que o cara compilou usando a API 8, e isso eu tb consigo, o problema é na API 19.

Jajá posto o resultado.




Andre, esse projeto não funcionou nem no 2.2... nem no 4.4.2... nem em lugar algum.
Vi na internet que é comum esse problema em conectar com o mysql usando API 19 (só não encontrei a solução ainda rs rs).
Está complicado demais fazer isso funcionar, me ajuda!!!




Andre, eu estou começando a achar que pode ser essa versão do eclipse ou do adt... Vc acha que pode ser isso? Não é possível!!! Já baixei alguns projetos na internet e simplesmente não funciona. Se concordar com essa minha hipótese... tem o link de uma versão "segura" do eclipse/adt???




Reinstalei o Eclipse e o adt (versões mais antigas) e nada...Seria a ausência de algum arquivo java connector? Me ajuda cara... estou empancado nisso a muitos dias.




Ola Francisco

pegue esse exemplo mysql

faca no wamp ou no xampp

coloque no mysql os campos q tao la no projeto....

depois mostre aqui as alteracoes q vc fez...




Andre, eu já tentei rodar o projeto original do link, todo certinho, inclusive com o banco que ele pede pra criar... Não rolou. Então creio que modificar meu projeto com base em um projeto que não funcionou vc não acha que é inviável não? Já rodei no xampp e no wamp... Posso te enviar meu projeto pra vc avaliar? Não creio que o problema seja o código...




Ola Francisco ....

vc ja baixou o projeto vendas do rafael e do exemplo mysql e naum deu certo???

formatei meu computador ontem ..

eu vou baixar o eclipse do android ...

envie seu arquivo p mim...




André, depois de atualizar o ADT, magicamente deu certo, obrigado.