>
Ola! Estou tentando terminar o aplicativos de vendas do curso de Android, porém estou travado nessa parte do BroadcastReceiver. Todo o restante do aplicativo está funcionando inclusive a replicação manual feita através do botão no menu principal. Fiz exatamente como na aula, porém quando envio um sms de um emulador para o outro, nada acontece. Tentei fazer o mesmo teste em dois aparelhos android 4.1.2 e também não está funcionando. Eu mando a sms de um aparelho o outro recebe a mensagem e nada acontece. Tentei mudar o código da classe para algo mínimo:
public class ExemploBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "SMS Chegou e replicação será inicializada!",Toast.LENGTH_LONG).show();
Log.e("SmsReceiver", "SMS Chegou e replicação será inicializada!");
}
}
OLA Jucemar
vc pode fazer este exemplo aki p ver se funciona??
pq pode ser teu eclipse
http://msatpathy.wordpress.com/android/send-and-receiving-sms-%E2%80%93-in-android/
Ola! Eu fiz o exemplo do link e aconteceu a mesma situação. No emulador que enviar a sms não ocorre problemas, porém no emulador que recebe o sms aparece a notificação de sms recebida padrão do android. Será que é o meu Eclipse?
opa jucemar..
desculpa... é q faz tempo q eu tinha assistido essa video aula
mostre
sua classe service
sua classe broadcast
seu manifest tbm
Segue abaixo:
Manifest:
[XML]
android:versionCode="1"
android:versionName="1.0" >
android:targetSdkVersion="8" />
android:protectionLevel="signature" />
android:required="true" />
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:label="@string/app_name" >
android:label="@string/title_activity_nova_venda" >
android:label="@string/title_activity_listar_vendas" >
android:label="@string/title_activity_map_shown" >
android:value="@integer/google_play_services_version" />
android:value="AIzaSyCmEFaesAHMrtHvTNuCb-TChUVOSvRyHr0" />
[/XML]
Service:
package com.example.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;
public class ExportarVendasService extends Service implements Runnable{
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate(){
new Thread(ExportarVendasService.this).start();
}
@Override
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.21/inserir.php?produto=");
strURL.append(cursor.getInt(cursor.getColumnIndex("produto")));
strURL.append("&preco=");
strURL.append(cursor.getInt(cursor.getColumnIndex("preco")));
strURL.append("&latitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("la")));
strURL.append("&longitude=");
strURL.append(cursor.getDouble(cursor.getColumnIndex("lo")));
try {
URL url=new URL(strURL.toString());
HttpURLConnection http=(HttpURLConnection)url.openConnection();
InputStreamReader ips=new InputStreamReader(http.getInputStream());
BufferedReader line=new BufferedReader(ips);
String linhaRetorno=line.readLine();
if(linhaRetorno.equals("Y")){
db.delete("vendas", "_id=?", new String[]{String.valueOf(cursor.getInt(0))});
totalReplicado ;
}
} catch (Exception e) {
Log.d("ExportarVendasService", "Erro ao replicar");
}
}
NotificationManager notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification nt=null;
if(totalDB==totalReplicado){
nt=new Notification(R.drawable.ic_launcher, "Status da Replicação", System.currentTimeMillis());
nt.flags |=Notification.FLAG_AUTO_CANCEL;
PendingIntent p=PendingIntent.getActivity(this, 0, new Intent(getApplicationContext(),MainActivity.class), 0);
nt.setLatestEventInfo(this, "Status da Replicação", "A replicação foi feita com sucesso, total: " totalReplicado ".", p);
}else{
nt=new Notification(R.drawable.ic_launcher, "Status da Replicação", System.currentTimeMillis());
nt.flags |=Notification.FLAG_AUTO_CANCEL;
PendingIntent p=PendingIntent.getActivity(this, 0, new Intent(getApplicationContext(),MainActivity.class), 0);
nt.setLatestEventInfo(this, "Status da 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();
stopSelf();
}
}
package com.example.vendas;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
public class ExemploBroadCastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i ) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
if (messages.length > -1) {
if (messages[0].getMessageBody().equals("replicar")) {
Toast.makeText(context, "SMS Chegou e replicação será inicializada!", Toast.LENGTH_LONG).show();
Intent it = new Intent("INICIAR_REPLICACAO");
context.startService(it);
}
}
}
}
}
}
eu acho q o seu problema é o mesmo deste topico aki
http://rlsystem.com.br/forum/android/561-erro-na-replicacao-de-dados#top
Ola! acredito que o meu problema seja diferente. Quando eu clico no botão "iniciar replicação" no menu principal, ela envia os dados para o meu servidor de mysql, eu já conferi no phpmyadmin, e quando ocorre sucesso ou fracasso na replicação, no caso de fracasso quanto não há conexão de rede, por exemplo , aparece a notificação informando a situação. Agora, quando eu tento fazer a replicação via sms, não funciona, o aparelho ou emulador recebe a sms e nada acontece.
Ola jucemar...
masvc manda msg replicar p o emulador q esta aplicacao e ele naum replica dados ou naum aparece sms??
Ola! Eu envio a mensagem "replicar" para o emulador ou aparelho que contém a aplicação instalada, este recebe a sms, inclusive ele avisa que chegou a sms na barra de notificação, porém o processo de replicação não acontece, ou seja, parece que a classe ExemploBroadCastReceiver não está conseguindo interceptar a sms que chegou e com isso ela não inicia o serviço de replicação dos dados.
ta faltando o i desse trecho do codigo...
for (int i = 0; i < pdus.length; i ) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); }
desculpa
i
i mais mais
isso é erro do formatador de código fonte aqui do fórum, no código do aplicativo tem esse "i ".
//i ;
entaum quando faz esse codigo
public class ExemploBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i ) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
if (messages.length > -1) {
Toast.makeText(context, "SMS Chegou e replicação será inicializada!",Toast.LENGTH_LONG).show();
Log.e("SmsReceiver", "SMS Chegou e replicação será inicializada!");
}
}
}
}
}
e tenta rodar ai q nem tu ta fazendo..
coloca na mensagem qualquer coisa e vê se aparece o Toast
desculpa eu ter colocado
entaum quando faz esse codigo
foi mal... ;-)
Olá, testei a sua dica. Dessa vez eu teste em vários emuladores: 2.2, 2.3, 4.2, 4.3, 4.4 e obtive o mesmo resultado. O broadcast não consegue executa o Toast nem o registro no LogCat.
baixa outro eclipse e exclui esse teu eclipse pq so pode ser teu eclipse...
depois de trocentas tentativas...
depois tu da um feedback p ver se funcionou....
Boa tarde Pessoal,
Estou com o mesmo problema que o Jucemar, executei os passos que vocês indicaram mas o problema persiste, pelo que identifiquei, a classe android.provider.Telephony.SMS_RECEIVED
não esta sendo reconhecida pelo Manifest.
Boa tarde pessoal,
Consegui solucionar o problema, o que estava ocorrendo oque que precisava solicitar a permissão para o usuário em tempo de execução.
Segue os links com maiores explicações.
http://developer.android.com/intl/pt-br/training/permissions/requesting.html