语音兰度短信

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

效果图:

具体代码如下:

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" />  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用

实际开发中控件的数据源肯定是动态绑定的,不可能在xaml里写死item项。既然要绑定,就先来几个实体类: ? 上面是类图,各类的代码如下:  Business...

31780
来自专栏腾讯数据中心

敬请收藏:数据中心常用标识的中英文对照

中国的数据中心在不断走向国际化,同时数据中心内的关键标识也逐渐采取了中英文双语标识。 今天,我们整理出腾讯数据中心内部使用的中英文标识对照。敬请收藏以备后续参考...

95240
来自专栏码匠的流水账

聊聊rocketmq的RequestTask

org/apache/rocketmq/remoting/netty/RequestTask.java

24220
来自专栏MasiMaro 的技术博文

遍历系统中加载的驱动程序以及通过设备对象指针获取设备对象名称

遍历系统中加载的驱动可以在R3层完成,通过几个未导出的函数:ZwOpenDirectoryObject、ZwQueryDirectoryObject,下面是具体...

15020
来自专栏calvin

SignalR主动通知订阅者示例

关键点:GlobalHost.ConnectionManager.GetHubContext

18930
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

1.3K80
来自专栏PPV课数据科学社区

【学习】七天搞定SAS(三):基本模块调用

搞定基本的函数之后,开始鼓捣SAS里面的模型。也就是说,要开始写PROC了。说实话,越学SAS,越觉得SAS像Stata...无论是从输出的样式,还是语法。好不...

35450
来自专栏GIS讲堂

openlayers2渐变色渲染

在前文中,讲到了oL2中唯一值渲染的实现方式,在本文讲述ol2中渐变色渲染的实现方式。

26420
来自专栏游戏杂谈

CURLcode的定义

http://curl.haxx.se/libcurl/c/libcurl-errors.html

45120
来自专栏MelonTeam专栏

Bitmap 源码阅读笔记

导语: Android 系统上的图片的处理,跟Bitmap 这个类脱不了关系,我们有必要去深入阅读里面的源码,以便在工作中能更好的处理Bitmap相关的问题...

32880

扫码关注云+社区

领取腾讯云代金券