android 发短信、打电话、发邮件

短信

1.发送短信

需要权限 android.permission.SEND_SMS

使用android.telephony.SmsManager类

普遍使用的方式

private void sendSmsMessage(String address,String message)throws Exception
    {
        SmsManager smsMgr = SmsManager.getDefault();
        Intent sent = new Intent();
        sent.setAction("com.send");
        PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, sent, 0);
        Intent delivery = new Intent();
        delivery.setAction("com.delivery");
        PendingIntent deliveryIntent = PendingIntent.getBroadcast(this, 0, delivery , 0);
        smsMgr.sendTextMessage(address, null, message, sentIntent, deliveryIntent);
    }

 BroadcastReceiver send = new BroadcastReceiver() {
		
		@Override
		public void onReceive(Context context, Intent intent) {
			
			if("com.send".equals(intent.getAction()))
				Toast.makeText(TelephonyDemo.this, "SMS send  success", 
	                	Toast.LENGTH_LONG).show();
		}
	};
	 BroadcastReceiver delivery = new BroadcastReceiver() {
			
			@Override
			public void onReceive(Context context, Intent intent) {
				if("com.delivery".equals(intent.getAction()))
					Toast.makeText(TelephonyDemo.this, "SMS delivery success", 
	                	Toast.LENGTH_LONG).show();
			}
		};

 另两种方式

sendDataMessage()接受一个附加参数以指定一个端口号,还会接受一个字节数组(不是一个String 消息)。

sendMultipartTextMessage()支持在整条消息大于SMS规范所允许的大小时发送文本消息。

SmsManager类提供了divideMessage()方法来帮助将较长的消息拆分为多个部分。

2.监视传入的SMS消息

需要权限:android.permission.RECEIVE_SMS

当设备收到SMS消息时,android会发出广播。该广播的action是android.provider.Telephony.SMS_RECEIVED

该action在文档上找不到,在源码的android.provider包下能找到Telephony类,其中有这么个action,同时有参数说明

  /**
             * Broadcast Action: A new text based SMS message has been received
             * by the device. The intent will have the following extra
             * values:</p>
             *
             * <ul>
             *   <li><em>pdus</em> - An Object[] od byte[]s containing the PDUs
             *   that make up the message.</li>
             * </ul>
             *
             * <p>The extra values can be extracted using
             * {@link #getMessagesFromIntent(Intent)}.</p>
             *
             * <p>If a BroadcastReceiver encounters an error while processing
             * this intent it should set the result code appropriately.</p>
             */
            @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
            public static final String SMS_RECEIVED_ACTION =
                    "android.provider.Telephony.SMS_RECEIVED";

具体实现

<receiver android:name="MySMSMonitor">
			<intent-filter>
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>

public class MySMSMonitor extends BroadcastReceiver {

	private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

	@Override
    public void onReceive(Context context, Intent intent)
    {
		if(intent!=null && intent.getAction()!=null && 
	        ACTION.compareToIgnoreCase(intent.getAction())==0)
	    {
	        Object[]pduArray = (Object[]) intent.getExtras().get("pdus");
	        SmsMessage[] messages = new SmsMessage[pduArray.length];
	        for (int i = 0; i<pduArray.length; i++) {
	            messages[i] = SmsMessage.createFromPdu((byte[])pduArray [i]);
	            Log.d("MySMSMonitor", "From: " + messages[i].getOriginatingAddress());
	            Log.d("MySMSMonitor", "Msg: " + messages[i].getMessageBody());
	        }
	        Log.d("MySMSMonitor","SMS Message Received.");
	    }
	}
}

访问SMS文件夹

需要权限 android.permission.READ_SMS

要读取SMS消息,必须对SMS收件箱进行查询。如下所示

public class SMSInboxDemo extends ListActivity {

    private ListAdapter adapter;
    private static final Uri SMS_INBOX = Uri.parse("content://sms/inbox");

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        Cursor c = getContentResolver()
                .query(SMS_INBOX, null, null, null, null);
        startManagingCursor(c);
        String[] columns = new String[] { "body" };
        int[] names = new int[] { R.id.row };
        adapter = new SimpleCursorAdapter(this, R.layout.sms_inbox, c, columns,
                names);

        setListAdapter(adapter);
    }
}

 以下是完整的SMS文件夹列表和每个文件夹的URI

所有文件夹  content://sms/all

收件箱 content://sms/inbox

已发送 content://sms/sent

草稿 content://sms/draft

发件箱 content://sms/outbox

发送失败 content://sms/failed

排队消息 content://sms/queued

未送达 content://sms/undelivered

对话 content://sms/conversations

 

 

发送电子邮件

android没有提供API来发送电子邮件,必须使用已注册的电子邮件应用程序。可以使用ACTION_SEND来启动电子邮件应用程序

 Intent emailIntent=new Intent(Intent.ACTION_SEND);

        String subject = "Hi!";
        String body = "hello from android....";

        String[] extra = new String[]{"aaa@bbb.com"};
      
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(Intent.EXTRA_TEXT, body);
		emailIntent.putExtra(Intent.EXTRA_EMAIL, extra);
        emailIntent.setType("message/rfc822");

        startActivity(emailIntent);

 可以向电子邮件Intent添加的其他"extra"消息包括EXTRA_CC(抄送)、EXTRA_BCC(密送)。如果希望在邮件中发送电子邮件附件。可以使用以下代码。


emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(new File(myFileName)));

打电话

播出电话的最简单方法是使用以下代码

Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678911"));
startActivity(intent);

 这段代码需要android.permission.CALL_PHONE权限。如果没有此权限,可以将Intent的操作更改为Intent.ACTION_VIEW.这会导致Dialer应用程序显示要拨打的目标号码,用户需要按下Send按钮才能开始呼叫。

 

 

监听电话状态

监听电话状态最简单的办法是在"android.intent.action.PHONE_STATE"上实现一个广播接收程序。可采用与上面监听传入的SMS消息相同的方式。

该action可以在文档中找到

http://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED

另一种方式是使用TelephonyManager

 private TelephonyManager teleMgr = null;
 private MyPhoneStateListener myListener = null;


@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        
        teleMgr = 
                (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        myListener = new MyPhoneStateListener();
    }

 @Override
    public void onResume() {
    	super.onResume();
    	Log.d("PhoneCallDemo", "In onResume");
        teleMgr.listen(myListener, PhoneStateListener.LISTEN_CALL_STATE);
    }
    
    @Override
    public void onPause() {
    	super.onPause();
    	Log.d("PhoneCallDemo", "In onPause");
        teleMgr.listen(myListener, PhoneStateListener.LISTEN_NONE);
    }

public class MyPhoneStateListener extends PhoneStateListener
    {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);

            switch(state)
            {
                case TelephonyManager.CALL_STATE_IDLE:
                    logText = "call state idle...incoming number is["+
                                incomingNumber+"]\n" + logText;
                    break;
                case TelephonyManager.CALL_STATE_RINGING:
                	logText = "call state ringing...incoming number is["+
                                incomingNumber+"]\n" + logText;
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                	logText = "call state Offhook...incoming number is["+
                                incomingNumber+"]\n" + logText;
                    break;
                default:
                	logText = "call state ["+state+"]incoming number is["+
                                incomingNumber+"]\n" + logText;
                    break;
            }
            print(logText);
        }
    }



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的 Android 的代码和布局文件: 1. 布局文件 `activity_main.xml`: ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/edit_text_phone_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Phone number" /> <EditText android:id="@+id/edit_text_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Message" /> <Button android:id="@+id/button_send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send" android:onClick="sendSMS" /> </LinearLayout> ``` 2. 的代码 `MainActivity.java`: ``` import android.app.Activity; import android.os.Bundle; import android.telephony.SmsManager; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText phoneNumberEditText; private EditText messageEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); phoneNumberEditText = (EditText) findViewById(R.id.edit_text_phone_number); messageEditText = (EditText) findViewById(R.id.edit_text_message); } public void sendSMS(View view) { String phoneNumber = phoneNumberEditText.getText().toString(); String message = messageEditText.getText().toString(); try { SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(phoneNumber, null, message, null, null); Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "SMS failed, please try again later.", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } } ``` 使用方法: 1. 在布局文件中定义界面控件:一个编辑框用于输入电话号码,一个编辑框用于输入内容,一个按钮用于。 2. 在 `MainActivity` 中获取界面控件的引用。 3. 在按钮的 `onClick` 方法中获取电话号码和内容,然后调用 `SmsManager` 。如果送成功,则显示一个 Toast 提示用户。如果送失败,则显示一个错误息并打印错误日志。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值