Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro com createFromPdu e MediaPlayer

Olá! Fiz a aula junto com o professor, e meus códigos ficaram assim:

SMSReceiver.java:

package br.com.kyomen.agenda.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.telephony.SmsMessage;
import android.widget.Toast;

import br.com.kyomen.agenda.R;
import br.com.kyomen.agenda.dao.AlunoDAO;

public class SMSReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Object[] pdus = (Object[]) intent.getSerializableExtra("pdus");
        byte[] pdu = (byte[]) pdus[0];
        String formato = intent.getStringExtra("format");
        SmsMessage sms = SmsMessage.createFromPdu(pdu, formato);
        String telefone = sms.getDisplayOriginatingAddress();
        AlunoDAO dao = new AlunoDAO(context);
        if (dao.ehAluno(telefone)) {
            Toast.makeText(context, "Chegou um SMS de um(a) aluno(a)!", Toast.LENGTH_SHORT).show();
            MediaPlayer mp = MediaPlayer.create(context, R.raw.msg);
            mp.start();
        }
        dao.close();
    }
}

Método ehAluno dentro do DAO:

public boolean ehAluno(String telefone) {
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery("SELECT * FROM Alunos WHERE telefone = ?", new String[]{telefone});
        int resultados = c.getCount();
        c.close();
        return resultados > 0;
    }

Tag receiver dentro de AndroidManifest (coloquei o uses-permission):

<receiver android:name=".receiver.SMSReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

Os erros são os seguintes:

No SMSReceiver, createFromPdu acusa erro por conta da API e sugere três autofixes (Add @RequiresApi(M) Annotation, Add @TargetApi(M) Annotation, Surround with if (VERSION.SDK_INT >= VERSION_CODES.M) {...}). Gostaria de saber qual é o autofix correto para esse problema.

No DAO, o texto sql acusa <expr> expected, got '?'

No Manifest, nenhum erro.

Como posso resolver tudo? Obrigado desde já!

2 respostas
solução!

Olá Gabriel,

Com relação ao createFromPdu, até a versão 23 do Android, o método createFromPdu não recebia o parâmetro do formato. A partir dessa versão, passamos a utilizar a versão que recebe o formato já que a anterior foi depreciada. A solução utilizada nesse caso é fazer uma verificação da versão do Android que está sendo utilizada antes de invocar o método. Ficaria algo parecido com isso:

SmsMessage sms;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    sms = SmsMessage.createFromPdu(pdu, formato);
} else {
    sms = SmsMessage.createFromPdu(pdu);
}

Com relação ao SQL, o código parece estar correto. O que parece estar acontecendo é que o telefone que foi passado para o método provavelmente estava nulo e a interrogação (?) do SQL não foi substituída corretamente. Tenta fazer a alteração do sms e vê se muda alguma coisa.

Obrigado professor!

O Toast não estava aparecendo pois eu tinha esquecido de dar ao app a permissão para receber o sms! facepalm

Quanto ao SQL, o erro continua aparecendo, mas tudo está funcionando. Coloquei até "SELECT * FROM Alunos WHERE telefone = telefone", e aí o erro sumiu. Não sei se isso acarretaria erros, então coloquei o "?" de volta no lugar, e tudo continua funcionando

Obrigado novamente, e parabéns por sua didática e curso, estou gostando muito!