原理:获取来电短信内容,调用系统的语音朗读功能。
效果图:
具体代码如下:
1,获取短信息:
[html] view plaincopy
- 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,注册广播:
[html] view plaincopy
- <receiver android:name="com.internal.message.SmsMessageReceiver" android:enabled="false">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED" />
- </intent-filter>
- </receiver>
3,消息显示及朗读功能:
[html] view plaincopy
- 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" />
[java] view plaincopy
- <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" />
时间: 2024-10-25 10:23:50