原理:获取来电短信内容,调用系统的语音朗读功能。
效果图:
具体代码如下:
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" />