Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Aula 4 ex. 1

Galera blz?

Meu receiver não está funcionando no emulador, recebo o sms e nada acontece, alguém tem alguma idéia?

Androimanifest:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="br.com.alura.agenda">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ListaAlunosActivity"
            android:label="Agenda">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FormularioActivity"
            android:label="Formulario">
        </activity>

        <receiver android:name="br.com.alura.agenda.receiver.SMSReceiver" android:enabled="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

SMSReceiver:

@Override
    public void onReceive(Context context, Intent intent) {

        Bundle bundle = intent.getExtras();
        Object[] messages = (Object[]) bundle.get("pdus");
        byte[] message = (byte[]) messages[0];
        SmsMessage sms = SmsMessage.createFromPdu(message);
        String telefone = sms.getOriginatingAddress();

        AlunoDAO dao = new AlunoDAO(context);
        boolean ehAluno = dao.isAluno(telefone);

        if(ehAluno) {
            Toast.makeText(context, "Chegou um SMS!!!", Toast.LENGTH_LONG).show();

            //MediaPlayer mp = MediaPlayer.create(context, R.raw.msg);
            //mp.start();
        }

        dao.close();
    }

Desde já obrigado,

10 respostas

Ola Leonardo da Silva Bilar !

Funciona quando roda usando o celular ou tablet ?

Já tentou montar um emulador novo ?

Usando emulador, muitas vezes tive problemas malucos que só resolveu fechando e abrindo o emulador OU criando um novo.

Abraço!

Posta o seu método isAluno da classe AlunoDAO.

Boa noite pessoal!

Desculpem a demora.

Cristiano, eu testei direto em meu celular hoje, mas continuou do mesmo jeito.

Felipe, segue o metodo isAluno.

    public boolean isAluno(String telefone) {

        Cursor rawQuery = getReadableDatabase().rawQuery("SELECT telefone from Alunos WHERE telefone = ?", new String[]{ telefone });

        int total = rawQuery.getCount();
        rawQuery.close();

        return total > 0;
    }

Obrigado!

Seu método isAluno está correto. Deixa eu ver toda a sua classe AlunoDAO.

Obrigado pela Ajuda Felipe,

AlunoDAO:

public class AlunoDAO extends SQLiteOpenHelper {

    public AlunoDAO(Context context) {
        super(context, "Agenda", null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE Alunos(" +
                "id INTEGER PRIMARY KEY," +
                "nome TEXT NOT NULL," +
                "endereco TEXT," +
                "telefone TEXT," +
                "site TEXT," +
                "caminhoFoto TEXT," +
                "nota REAL);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS Alunos";
        db.execSQL(sql);
        onCreate(db);
    }

    public void insere(Aluno aluno) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues dados = pegaDadosDoAluno(aluno);

        db.insert("Alunos   ", null, dados);
    }

    public void altera(Aluno aluno) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues dados = pegaDadosDoAluno(aluno);

        String[] params = {aluno.getId().toString()};
        db.update("Alunos", dados, "id = ?", params);
    }

    public List<Aluno> buscaAlunos() {
        String sql = "SELECT * FROM Alunos";
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery(sql, null);

        List<Aluno> alunos = new ArrayList<>();

        while(c.moveToNext()) {
            Aluno aluno = new Aluno();
            aluno.setId(c.getLong(c.getColumnIndex("id")));
            aluno.setNome(c.getString(c.getColumnIndex("nome")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereco")));
            aluno.setTelefone(c.getString(c.getColumnIndex("telefone")));
            aluno.setSite(c.getString(c.getColumnIndex("site")));
            aluno.setNota(c.getDouble(c.getColumnIndex("nota")));
            aluno.setFoto(c.getString(c.getColumnIndex("caminhoFoto")));

            alunos.add(aluno);
        }
        c.close();

        return alunos;
    }

    public void deleta(Aluno aluno) {
        SQLiteDatabase db = getWritableDatabase();
        String[] params = {aluno.getId().toString()};
        db.delete("Alunos", "id = ?", params);
    }

    @NonNull
    private ContentValues pegaDadosDoAluno(Aluno aluno) {
        ContentValues dados = new ContentValues();
        dados.put("nome", aluno.getNome());
        dados.put("endereco", aluno.getEndereco());
        dados.put("telefone", aluno.getTelefone());
        dados.put("site", aluno.getSite());
        dados.put("nota", aluno.getNota());
        dados.put("caminhoFoto", aluno.getFoto());
        return dados;
    }

    public boolean isAluno(String telefone) {

        Cursor rawQuery = getReadableDatabase().rawQuery("SELECT telefone from Alunos WHERE telefone = ?", new String[]{ telefone });

        int total = rawQuery.getCount();
        rawQuery.close();

        return total > 0;
    }
}

Vou postar tambem meu AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.alura.agenda">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ListaAlunosActivity"
            android:label="Agenda">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FormularioActivity"
            android:label="Formulario">
        </activity>

        <receiver android:name="br.com.alura.agenda.receiver.SMSReceiver" android:enabled="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

Achei estranho que quando digitei essa parte, a IDE não autocompletou o SMS_RECEIVED.

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

Obrigado, pela ajuda!

Android Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.alura.agenda">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ListaAlunosActivity"
            android:label="Agenda">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FormularioActivity"
            android:label="Formulario">
        </activity>

        <receiver android:name="br.com.alura.agenda.receiver.SMSReceiver" android:enabled="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

Sem querer marquei a minha ultima interação como a solução da dúvida.

Leonardo,

Poderia postar a activity onde vc usa o metodo: isAluno() ?

solução!

Você tá emulando o projeto num Android 6? Nesse caso, você precisa ir na tela de configurações do aplicativo e ativar a permissão para receber SMS.

Pessoal obrigado pela ajuda.

Felipe, estou utilizando o Android 6 sim, depois que ativei a configuração funcionou direitinho.

Obrigado!