整理一下使用SmsManager类发送短信的方法。
SmsManager类的描述如下图:
使用的关键方法是sendTextMessage()发短信。
该方法的使用说明如下图:根据以上资料,结合Andriod6.0的运行时权限,发短信Demo如下:
public class MainActivity extends AppCompatActivity { private static final int MY_PERMISSIONS_REQUEST_SEND_SMS = 1; private EditText et_number; private EditText et_content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取控件 et_number = (EditText) findViewById(R.id.et_number); et_content = (EditText) findViewById(R.id.et_content); } // 在XML中指定的按钮回调方法 public void Send(View v){ // 检查是否获得了权限(Android6.0运行时权限) if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED){ // 没有获得授权,申请授权 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SEND_SMS)) { // 返回值:// 如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true.// 如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false.// 如果设备策略禁止应用拥有这条权限, 这个方法也返回false. // 弹窗需要解释为何需要该权限,再次请求授权 Toast.makeText(this, "请授权!", Toast.LENGTH_LONG).show(); // 帮跳转到该应用的设置界面,让用户手动授权 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); }else{ // 不需要解释为何需要该权限,直接请求授权 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS); } }else { // 已经获得授权,可以发短信 SendSms(); } } private void SendSms() { // 获取数据内容 String number = et_number.getText().toString(); String content = et_content.getText().toString(); // 为空判断 if (TextUtils.isEmpty(number)||TextUtils.isEmpty(content)) { // 提醒用户 Toast.makeText(this, "号码或内容不能为空!", Toast.LENGTH_SHORT).show(); } else { // 使用SmsManager类 SmsManager smsManager = SmsManager.getDefault(); // 短信内容可能很长,需要分发 ArrayListparts = smsManager.divideMessage(content); // 发送短信,需要权限// smsManager.sendMultipartTextMessage(number, null, parts, null, null); for(String text : parts) { smsManager.sendTextMessage(number, null, text, null, null); } // 发送完成后弹窗提示 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("已发送!") .setNegativeButton("好!", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 关闭当前弹窗 dialog.dismiss(); } }); AlertDialog dialog = builder.show(); } } // 处理权限申请的回调 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode){ case MY_PERMISSIONS_REQUEST_SEND_SMS: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 授权成功,继续发短信 SendSms(); } else { // 授权失败! Toast.makeText(this, "授权失败!", Toast.LENGTH_LONG).show(); } break; } } }}
要点小结:
- 使用SmsManager类发送短信。
- 使用SmsManager.getDefault()来获得SmsManager类实例。
- 短信内容过长时,需要使用divideMessage()方法来分割。
- 号码和短信内容需要加上为空判断,否则报错非法参数异常。
- 【重要】只在真机上可行,也许是模拟器没有SIM卡的原因?