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

Trabalhando com serviços em background - MediaPlayer não toca música

Meu SMSReceiver está sendo chamado, o telefone é de um aluno, porém não toca a música, segue código do método onReceive:

Obs: coloquei um Toast para ver se aparecia, porém também sem sucesso, alguma idéia do que estou fazendo errado?

public void onReceive(Context context, Intent intent){ Bundle bundle = intent.getExtras(); Object messages[] = (Object[]) bundle.get("pdus"); SmsMessage smsMessage[] = new SmsMessage[messages.length]; for (int n = 0; n < messages.length; n++) { smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); } AlunoDAO dao = new AlunoDAO (context) ; if(smsMessage[0] != null){ if (dao.isAluno (smsMessage[0].getDisplayOriginatingAddress())) { MediaPlayer mp = MediaPlayer.create(context, R.raw.msg); mp.start(); Toast.makeText(context, "Nr do aluno que enviou a mensagem: " + smsMessage[0].getOriginatingAddress(), Toast.LENGTH_LONG).show(); } } }

5 respostas

Olá!

Você poderia postar aqui os códigos do seu AndroidManifest.xml e do AlunoDAO por favor? Assim podemos tentar descobrir o que está acontecendo!

Abraço!

Android Manifest.xml:

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

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application android:allowBackup="true" android:label="@string/app_name"
        android:icon="@drawable/ic_launcher" android:supportsRtl="true">

        <activity android:name="br.com.caelum.cadastro.ListaAlunosActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="br.com.caelum.cadastro.FormularioActivity"
            android:label="@string/app_name" />
        <activity android:name="br.com.caelum.cadastro.WebViewActivity"
            android:label="@string/site_aluno" />

        <receiver android:name="br.com.caelum.cadastro.SMSReceiver" android:enabled="true">
            <intent-filter android:priority="1">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

AlunoDAO.java

package br.com.caelum.cadastro.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


import java.util.ArrayList;
import java.util.List;

import br.com.caelum.cadastro.model.Aluno;

/**
 * Created by guilherme.costa on 16/12/2015.
 */
public class AlunoDAO {


    private SQLiteOpenHelper helper ;
    private static final String DATABASE = "caelumDB";
    private static final int VERSION = 1;
    private static final String TABELA = "alunos";

    public AlunoDAO(Context context) {

        helper = new SQLiteOpenHelper(context, DATABASE, null, VERSION) {
            @Override
            public void onCreate(SQLiteDatabase db) {
                String sql = "CREATE TABLE " + TABELA +
                        "(id INTEGER PRIMARY KEY," +
                        " nome TEXT UNIQUE NOT NULL," +
                        " telefone TEXT," +
                        " endereco TEXT," +
                        " site TEXT," +
                        " nota REAL," +
                        " foto TEXT" +
                        ");";
                db.execSQL(sql);

            }

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

            }
        };
    }


    public void inserir(Aluno aluno) {
        helper.getWritableDatabase().insert(TABELA, null, toContentValues(aluno));
        helper.close();
    }

    private ContentValues toContentValues(Aluno aluno) {
        ContentValues cv = new ContentValues();
        cv.put("nome", aluno.getNome());
        cv.put("endereco", aluno.getEndereco());
        cv.put("telefone", aluno.getTelefone());
        cv.put("site", aluno.getSite());
        cv.put("nota", aluno.getNota());
        cv.put("foto", aluno.getCaminhoFoto());
        return cv;
    }


    public List<Aluno> getLista() {
        List<Aluno> alunos = new ArrayList<Aluno>();
        String sql = "SELECT * FROM Alunos";
        Cursor cursor = helper.getReadableDatabase().rawQuery(sql, null);

        while(cursor.moveToNext()){
            Aluno aluno = new Aluno();
            aluno.setId(cursor.getLong(cursor.getColumnIndex("id")));
            aluno.setNome(cursor.getString(cursor.getColumnIndex("nome")));
            aluno.setEndereco(cursor.getString(cursor.getColumnIndex("endereco")));
            aluno.setTelefone(cursor.getString(cursor.getColumnIndex("telefone")));
            aluno.setSite(cursor.getString(cursor.getColumnIndex("site")));
            aluno.setCaminhoFoto(cursor.getString(cursor.getColumnIndex("foto")));
            aluno.setNota(cursor.getDouble(cursor.getColumnIndex("nota")));
            alunos.add(aluno);
        }

        cursor.close();
        return alunos;
    }

    public void deletar(Aluno aluno) {
        String[] args = {aluno.getId().toString()};
        helper.getWritableDatabase().delete(TABELA, "id=?", args);
        helper.close();
    }

    public void atualizar(Aluno aluno) {
        String[] args =  {aluno.getId().toString()};
        helper.getWritableDatabase().update(TABELA, toContentValues(aluno), "id=?", args);
    }

    public boolean isAluno(String telefone) {
        Cursor rawQuery = helper.getReadableDatabase().rawQuery("SELECT telefone from " + TABELA
                + " WHERE telefone = ?", new String[]{telefone});

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

        return total > 0;
    }
}

"

"

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

<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application android:allowBackup="true" android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:supportsRtl="true"> ` ` <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="br.com.caelum.cadastro.FormularioActivity" android:label="@string/app_name" /> <activity android:name="br.com.caelum.cadastro.WebViewActivity" android:label="@string/site_aluno" />

<receiver android:name="br.com.caelum.cadastro.SMSReceiver" android:enabled="true"> <intent-filter android:priority="1"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> </application> </manifest>

solução!

Olá, o código aparentemente está correto. Você está fazendo testes com o emulador e o Android Monitor ou com um dispositivo real?

Se ele está entrando no onReceive(...) mas não tá tocando o som então a única explicação é que o telefone que está chegando não está batendo com o telefone cadastrado na agenda. No emulador é mais fácil fazer bater com algum número da agenda mas no dispositivo vai depender de como o SMS está registrando o telefone do remetente.

Faça um teste e peça para imprimir o telefone que está chegando no SMS. Pode ser algo bem simples dentro do seu onReceive(...):

Log.i("SMS", smsMessage[0].getDisplayOriginatingAddress());

Aí compare com os telefones que estão cadastrados na sua agenda para certificar que esse não é o problema.

Abraço!