现在的位置: 首页 > 综合 > 正文

android 语音朗读短消息

2013年09月14日 ⁄ 综合 ⁄ 共 4486字 ⁄ 字号 评论关闭

原理:获取来电短信内容,调用系统的语音朗读功能。

效果图:

具体代码如下:

1,获取短信息:

package com.internal.message;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.telephony.SmsMessage;
import android.test.suitebuilder.annotation.SmallTest;

public class SmsMessageReceiver extends BroadcastReceiver {
   
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras == null)
            return;

        Object[] pdus = (Object[]) extras.get("pdus");

            SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[0]);
            String fromAddress = message.getOriginatingAddress();
            String fromDisplayName = fromAddress;

            Uri uri;
            String[] projection;

            uri = Uri.withAppendedPath(
                    ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
                    Uri.encode(fromAddress));
            projection = new String[] { ContactsContract.PhoneLookup.DISPLAY_NAME };

            // 查找联系人
            Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
            if (cursor != null) {
                if (cursor.moveToFirst())
                    fromDisplayName = cursor.getString(0);

                cursor.close();
                cursor=null;
            }

            // 启动消息显示器
            Intent di = new Intent();
            di.setClass(context, SmsReceivedDialog.class);
            di.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            di.putExtra(MsgAction.SMS_FROM_ADDRESS_EXTRA, fromAddress);
            di.putExtra(MsgAction.SMS_FROM_DISPLAY_NAME_EXTRA, fromDisplayName);
            di.putExtra(MsgAction.SMS_MESSAGE_EXTRA, message.getMessageBody().toString());
            context.startActivity(di);
  
    }
    
}

2,注册广播:

<receiver android:name="com.internal.message.SmsMessageReceiver" android:enabled="false">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

3,消息显示及朗读功能:

package com.internal.message;

import java.util.Locale;

import com.internal.main.R;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;


public class SmsReceivedDialog extends Activity implements OnInitListener {
	
    private static final String TAG = "SmsReceivedDialog";
    private static final int DIALOG_SHOW_MESSAGE = 1;

    private TextToSpeech mTts;
    private String mFromDisplayName;
    private String mFromAddress;
    private String mMessage;
    private String mFullBodyString;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mFromAddress = getIntent().getExtras().getString(MsgAction.SMS_FROM_ADDRESS_EXTRA);
        mFromDisplayName = getIntent().getExtras().getString(MsgAction.SMS_FROM_DISPLAY_NAME_EXTRA);
        mMessage = getIntent().getExtras().getString(MsgAction.SMS_MESSAGE_EXTRA);

        mFullBodyString = String.format(
                getResources().getString(R.string.sms_speak_string_format),
                " "+mFromDisplayName,
                "message said:"+mMessage);

        showDialog(DIALOG_SHOW_MESSAGE);
        mTts = new TextToSpeech(this, this);
    }

    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            int result = mTts.setLanguage(Locale.US);
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e(TAG, "TTS language is not available.");
            } else {
                mTts.speak(mFullBodyString, TextToSpeech.QUEUE_ADD, null);
            }
        } else {
            // Initialization failed.
            Log.e(TAG, "Could not initialize TTS.");
        }
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_SHOW_MESSAGE:
            return new AlertDialog.Builder(this)
                    .setIcon(android.R.drawable.ic_dialog_email)
                    .setTitle("Message Received")
                    .setMessage(mFullBodyString)
                    .setPositiveButton("replay", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            
                            Intent i = new Intent();
                            i.setClass(SmsReceivedDialog.this, SendMsgActivity.class);
                            i.putExtra(MsgAction.SMS_RECIPIENT_EXTRA, mFromAddress);
                            startActivity(i);

                            dialog.dismiss();
                            finish();
                        }
                    })
                    .setNegativeButton("display", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            dialog.dismiss();
                            finish();
                        }
                    })
                    .setOnCancelListener(new DialogInterface.OnCancelListener() {
                        public void onCancel(DialogInterface dialog) {
                            finish();
                        }
                    }).create();
        }
        return null;
    }
    
    @Override
    protected void onDestroy() {
    	if (mTts != null) {
    		mTts.stop();
    		mTts.shutdown();
    		mTts=null;
        }
    	super.onDestroy();
    }
    
}

最后别忘了添加权限,要不不能读取信息呀!

 <uses-permission android:name="android.permission.READ_CONTACTS" />

 <uses-permission android:name = "android.permission.READ_PHONE_STATE"/>
     <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS" />

抱歉!评论已关闭.