Solucionado (ver solução)
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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software