目录

模拟效果:

短信发送器:


短信发送器demo地址:https://github.com/liuchenyang0515/SmsSend

模拟效果:

我们初步想要的功能就是ListView显示一些数据,点击这些数据后想要发送一些祝福短信,要求把这些内容直接显示在发送短信界面的编辑框内,方便发送,因为这个不是我们自己写的界面,所以用隐式意图。为了查找putExtra的键,我们需要查看系统源码。

MainActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class MainActivity extends AppCompatActivity {String[] s = {"真心的编织快乐,细心的装满幸福,小心的盛上吉祥,用心的放入喜庆,耐心的把它们进行包装,诚心的用短信发送给你...","周末又已来到,祝福轮番开炮,瞄准劳累之敌,把疲惫郁闷轰掉,打响开心号弹,吹起愉悦号角,冲向快乐山头,让舒畅飘扬高高...","人生忙忙碌碌,日子酸酸甜甜,缘分简简单单,联系断断续续,惦记时时刻刻,祝福长长久久,天天开开心心,祝你平平安安,周末愉快!","勤勤工作,兢兢业业报国志。肯肯上进,升职加薪见几人?东奔西跑,忙忙碌碌周身痛..."};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 找到lvListView lv = (ListView) findViewById(R.id.lv);// 设置数据ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.item, s);// 设置数据适配器lv.setAdapter(adapter);// 给listview设置点击事件lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// 把点击条目数据取出来,数据在哪里存着就去哪里取String content = s[position];// 跳转到发送短信的页面// 查询源码得到意图过滤器// 源码查看地址https://www.androidos.net.cn/android/8.0.0_r4/xref/packages/apps/Messaging/AndroidManifest.xml/*<intent-filterandroid:label="@string/share_intent_label"><action android:name="android.intent.action.SEND" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" /><data android:mimeType="text/x-vCard" /><data android:mimeType="text/x-vcard" /><data android:mimeType="image/*" /><data android:mimeType="audio/*" /><data android:mimeType="application/ogg" /></intent-filter>*/Intent intent = new Intent();// 设置actionintent.setAction("android.intent.action.SEND");// 添加categoryintent.addCategory("android.intent.category.DEFAULT");// 设置typeintent.setType("text/plain");// 传递数据intent.putExtra(Intent.EXTRA_TEXT, content);// 跳转到发送短信的页面startActivity(intent);}});}
}

查找到android系统源码目录:packages/apps/Messaging/AndroidManifest.xml

地址:

https://www.androidos.net.cn/android/8.0.0_r4/xref/packages/apps/Messaging/AndroidManifest.xml

查找动作android.intent.action.SEND去匹配,发现如下:

        <!-- Handles sharing intent --><activityandroid:name=".ui.conversationlist.ShareIntentActivity"android:configChanges="orientation|screenSize|keyboardHidden"android:screenOrientation="user"android:theme="@style/BugleTheme.DialogActivity"android:excludeFromRecents="true"android:documentLaunchMode="always"><intent-filterandroid:label="@string/share_intent_label"><action android:name="android.intent.action.SEND" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" /><data android:mimeType="text/x-vCard" /><data android:mimeType="text/x-vcard" /><data android:mimeType="image/*" /><data android:mimeType="audio/*" /><data android:mimeType="application/ogg" /></intent-filter><intent-filterandroid:label="@string/share_intent_label"><action android:name="android.intent.action.SEND_MULTIPLE" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="image/*" /></intent-filter></activity>

看到这个动作是ui.conversationlist.ShareIntentActivity里面的,然后去这个里面找接收数据的键来确定我们发送数据的键是什么。

是哪个包下面的呢?

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.android.messaging"android:installLocation="internalOnly">

原来是com.android.messaging包底下的

即package com.android.messaging.ui.conversationlist;

网页地址:

https://www.androidos.net.cn/android/8.0.0_r4/xref/packages/apps/Messaging/src/com/android/messaging/ui/conversationlist/ShareIntentActivity.java

找到之后,在网页中查找getStringExtra去匹配文本

发现了一个Intent.EXTRA_TEXT,这就是我们想要的键

然后putExtra进去的就是这个键。

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"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView>
</LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content" />

运行结果(真机测试):

点击一个item,分享到“信息”

然后发现item里面的内容已经在编辑框内了。

短信发送器:

MainActivity.java

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;import java.util.List;public class MainActivity extends AppCompatActivity {private EditText et_number;private EditText et_content;private static final int REQUESTCODE_ADD = 1;private static final int REQUESTCODE_INSERT = 2;@Overrideprotected 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);}public void onclick(View view) {switch (view.getId()) {case R.id.btn_add:Intent intent = new Intent(this, ContactActivity.class);startActivityForResult(intent, REQUESTCODE_ADD);break;case R.id.btn_send:// 获取动态权限if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 1);} else {sendSms();}break;case R.id.btn_insert:Intent intent2 = new Intent(this, SmsTemplateActivity.class);startActivityForResult(intent2, REQUESTCODE_INSERT);break;}}private void sendSms() {// 获取发送短信的号码和发送的内容String number = et_number.getText().toString().trim();String content = et_content.getText().toString().trim();// 获取SmsManager实例SmsManager smsManager = SmsManager.getDefault();List<String> divideMessage = smsManager.divideMessage(content);for (String div : divideMessage) {smsManager.sendTextMessage(number, null, div, null, null);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.SEND_SMS)) {showPermissionDialog(permissions);} else {Toast.makeText(this, "您已拒绝权限,请在设置手动打开权限", Toast.LENGTH_SHORT).show();}return;}}sendSms();}break;}}private void showPermissionDialog(final String[] permissions) {AlertDialog.Builder dialog = new AlertDialog.Builder(this);dialog.setTitle("提示!");dialog.setMessage("这个权限关系到发送短信,如拒绝需要在设置手动打开!");dialog.setCancelable(false);dialog.setPositiveButton("授权", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);}});dialog.setNegativeButton("拒绝", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});dialog.show();}// 当我们开启的activity页面关闭的时候调用此方法@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case REQUESTCODE_ADD:if (resultCode == RESULT_OK) {String phone = data.getStringExtra("phone");et_number.setText(phone);}break;case REQUESTCODE_INSERT:if (resultCode == RESULT_OK) {String smsContent = data.getStringExtra("smsContent");//et_content.setText(smsContent);et_content.append(smsContent);}break;}}
}

批注:

public void sendTextMessage (String destinationAddress, String scAddress,

String text, PendingIntent sentIntent, PendingIntent deliveryIntent)

发送基于短信的文本。

注:使用此方法需要您的应用程序具有Manifest.permission.SEND_SMS许可。

注:从Android4.4开始(API级别19),如果只有当不选择应用程序作为默认SMS应用程序,系统会自动将使用此方法发送的消息写入SMS提供者(默认SMS应用始终负责将其发送的消息写入SMS提供程序)。有关如何作为默认SMS应用程序运行的信息,请参阅Telephony.

参数
destinationAddress String:要发送消息的地址
scAddress String:是服务中心地址或null以使用当前默认SMSC
text String:要发送的消息正文
sentIntent PendingIntent:如果不为空,则为PendingIntent消息成功发送或失败时广播。结果代码将是Activity.RESULT_OK对于成功,或其中的一个错误:
RESULT_ERROR_GENERIC_FAILURE
RESULT_ERROR_RADIO_OFF
RESULT_ERROR_NULL_PDU
RESULT_ERROR_GENERIC_FAILURESentIntent可能包含无线电技术特定值的额外“错误代码”,通常只对故障排除有用。
基于每个应用程序的SMS控制检查哨兵。如果SentIntent为NULL,调用者将根据所有未知的应用程序进行检查,这将导致在检查期间发送较少数量的SMS。
deliveryIntent PendingIntent:如果不为空,则为PendingIntent消息传递到收件人时广播。状态报告的原始PDU位于扩展数据(“PDU”)中。
抛出
IllegalArgumentException 如果destinationAddress或Text为空

短信太长就会分成几封发送出去,所以要用divideMessage

public ArrayList<String> divideMessage (String text)

将一个消息文本分成几个片段,没有一个大于最大SMS消息大小。

参数
text String:原始信息。不能是空的。
回报
ArrayList<String> ArrayList的字符串,按顺序组成原始消息。
抛出
IllegalArgumentException 如果文本为空

ContactActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;public class ContactActivity extends AppCompatActivity {private List<Person> lists;private ListView lv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 加载布局setContentView(R.layout.activity_contact);lv = (ListView) findViewById(R.id.lv);lists = new ArrayList<>();for (int i = 0; i < 20; ++i) {Person p = new Person();p.setName("张三");p.setPhone("11" + i);lists.add(p);}// 展示数据lv.setAdapter(new Myadapter());// 给listview设置点击事件lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {// parent代表listview,view代表item,可在断点调试验证@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// 获取点中item的数据String phone = lists.get(position).getPhone();// 把数据返回给调用者Intent intent = new Intent();intent.putExtra("phone", phone);// 把结果返回给调用者setResult(RESULT_OK, intent);// 关闭当前页面finish(); // finish后通过onActivityResult返回数据}});}@Overridepublic void onBackPressed() {}private class Myadapter extends BaseAdapter {@Overridepublic int getCount() {return lists.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view;ViewHolder viewHolder;if (convertView == null) {// 获取子布局view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.contact_item, parent, false);viewHolder = new ViewHolder();// 找到在item中定义的控件来显示数据// 一定要写view.findViewById,findViewById是有上下文的,默认是在Activity的主布局中viewHolder.tv_name = (TextView) view.findViewById(R.id.tv_name);viewHolder.tv_phone = (TextView) view.findViewById(R.id.tv_phone);view.setTag(viewHolder);} else {view = convertView;viewHolder = (ViewHolder) view.getTag();}// 展示数据viewHolder.tv_name.setText(lists.get(position).getName());viewHolder.tv_phone.setText(lists.get(position).getPhone());return view;}private class ViewHolder {TextView tv_name, tv_phone;}}
}

Person.java

public class Person {private String name;private String phone;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}
}

SmsTemplateActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class SmsTemplateActivity extends AppCompatActivity {String[] str = {"我在吃饭,请稍后联系", "我在开会,请稍后联系","我在上课,请稍后联系", "我在加班,请稍后联系","我在约会,请稍后联系"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_smstemplate);ListView lv = (ListView) findViewById(R.id.lv);ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.smstemplate_item, R.id.tv, str);// 显示数据lv.setAdapter(adapter);// 设置item点击事件lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// 取出点击item的数据String smsContent = str[position];// 把smsContent返回给调用者Intent intent = new Intent();intent.putExtra("smsContent", smsContent);setResult(RESULT_OK, intent);finish();}});}
}

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"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/et_number"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入手机号码" /><Buttonandroid:id="@+id/btn_add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@id/et_number"android:layout_marginBottom="8dp"android:layout_alignParentRight="true"android:onClick="onclick"android:text="+" /></RelativeLayout><EditTextandroid:id="@+id/et_content"android:layout_width="match_parent"android:gravity="top"android:layout_height="200dp"android:hint="请输入发送短信的内容" /><Buttonandroid:id="@+id/btn_insert"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onclick"android:text="插入短信模版"/><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onclick"android:text="发送"/>
</LinearLayout>

activity_contact.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"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView>
</LinearLayout>

contact_item.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="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_name"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="aaa"android:textSize="20sp" /><TextViewandroid:id="@+id/tv_phone"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="110"android:textSize="20sp" />
</LinearLayout>

activity_smstemplate.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"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView>
</LinearLayout>

smstemplate_item.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"><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20sp"/>
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.sms_send"><uses-permission android:name="android.permission.SEND_SMS" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".ContactActivity" /><activity android:name=".SmsTemplateActivity" /></application>
</manifest>

具体代码见github:https://github.com/liuchenyang0515/SmsSend

==========================Talk is cheap, show me the code=========================

android学习笔记----短信发送器相关推荐

  1. Android学习——收发短信

    Android学习--收发短信 1.短信基本API介绍 使用Android API类库可以自己实现收发短信的功能: 信息的发送,对mms应用程序来讲主要是在信息数据库中创建并维护一条信息记录,真正的发 ...

  2. Android之制作短信发送器

    这次,我们做一个手机都有的功能--发短信,首先,既然是个小软件,新建项目的时候顺便图标也选为短信图标那个.首先我们还是先来实现页面布局,到activity_main.xml添加代码(我的默认是相对布局 ...

  3. Android实现简单短信发送器

    布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:too ...

  4. Android两个小Demo之电话拨号器和短信发送器

    两个简单的小案列 <1>电话拨号器 实现一个电话拨号器,我们分为简单的三步走: 1.在layout中写好布局 2.在MainActivity中写出对应的事件 3.在Manifest中配置好 ...

  5. Android实现电话拨号器和短信发送器

    电话拨号器 实现原理:用户输入电话号码,当点击拨打的时候,由监听对象捕获,监听对象通过文本控件获取到用户输入的电话号码,由于系统已经实现了电话拨号功能,所以我们只需要调用这个功能就可以了. 步骤: 1 ...

  6. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  7. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  8. 实例教程二:短信发送器

    2012eoe移动开发者大会各嘉宾ppt汇总 http://www.eoeandroid.com/thread-206795-1-1.html OpenGL es 3D游戏火力篮球源码及PPT教程 h ...

  9. android实现发送短信的功能

    在上次的博客中已经实现了拨打电话的功能,但是在实际中使用短信的几率也是比较大的,好多手机卡短信都是包月的,像移动校园卡每个月可以发200条短信,超出之后才付钱.但这些日子已经一去不复返了,我也毕业了, ...

最新文章

  1. 机器学习入门(05)— 使用 NumPy 实现 3 层简单神经网络
  2. golang 程序后台运行的方法 linux windows
  3. 加固工程验收规范50550_石家庄栾城县厂房梁柱加固施工队规范作业-建筑加固
  4. MVVM模式的3种command总结[2]--RelayCommand
  5. 201621123065《JAVA程序设计》第11周学习总结
  6. oracle软件静默安装程序,【oracle】静默安装 oracle 11gr2
  7. linux resin 服务功能,linux服务之resin
  8. Exchange Server2010系列之三:Exchange Server部署完成后的配置
  9. 网课老师凭什么年薪200万?
  10. 查看嵌入式设备的CPU频率
  11. Netty的并发编程实践1:正确使用锁
  12. 漫谈 Clustering (番外篇): Expectation Maximization
  13. 中专计算机应用基础知识点归纳,《计算机应用基础》各章知识点归纳大全
  14. 【历史上的今天】2 月 17 日:谷歌收购 Blogger;英伟达创始人出生;微软发布 Windows 2000
  15. 个人承接微信H5制作设计,需要的联系我
  16. 目标框检测中准确率、召回率、AP、mAP计算原理及代码
  17. PS 切图 保存图片
  18. python中strip的用法
  19. 人工智能定价算法的发展,使得默示共谋更为普遍
  20. linux 常用命令全称

热门文章

  1. 慧鱼机器人编程17变量
  2. CorelDRAWX4的C++插件开发(三十九)纯C++插件开发(3)声明变量并暴露导出函数
  3. 更改intellij高亮字体背景颜色
  4. 24小时智慧图书馆解决方案,校园智能微型图书馆
  5. 企业邮箱怎么注册账号?忘记邮箱密码怎么修改密码?
  6. git项目使用教程(eclipse)
  7. XP系统恢复administrator账户的方法
  8. CF997C Sky Full of Stars
  9. Android 修改字体
  10. 编程语言十二生肖查询网页版制作(php)