>

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.



Problemas com a classe ExemploBroadCastReceiver - Aplicativo de vendas.


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!");
}
}


e nada acontece. Veja o meu manifest:
[XML]

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

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

android:name="com.example.vendas.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />












android:glEsVersion="0x00020000"
android:required="true" />

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






android:name="com.example.vendas.NovaVendaActivity"
android:label="@string/title_activity_nova_venda" >

android:name="com.example.vendas.ListarVendasActivity"
android:label="@string/title_activity_listar_vendas" >

android:name="com.example.vendas.MostrarMapa"
android:label="@string/title_activity_map_shown" >


















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



[/XML]

Alguém tem alguma dica ?



21 Respostas


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]

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

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

android:name="com.example.vendas.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />












android:glEsVersion="0x00020000"
android:required="true" />

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






android:name="com.example.vendas.NovaVendaActivity"
android:label="@string/title_activity_nova_venda" >

android:name="com.example.vendas.ListarVendasActivity"
android:label="@string/title_activity_listar_vendas" >

android:name="com.example.vendas.MostrarMapa"
android:label="@string/title_activity_map_shown" >


















android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
android:name="com.google.android.maps.v2.API_KEY"
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();



}

}


BroadCast:


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]);                 }








isso é erro do formatador de código fonte aqui do fórum, no código do aplicativo tem esse "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