您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
11_案例2 android下的短信发送器
发布时间:2021-02-02 15:38:15编辑:雪饮阅读()
聚焦
昨天写的这个拨打电话功能,默认进入界面后没有自动聚焦到请输入手机号
如果要实现可编辑文本输入框自动聚焦,则可将该文本编辑输入框修改为双标签
并在其中嵌入<requestFocus />标签
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号"
android:id="@+id/et_number"
android:numeric="integer"
android:lines="1"
>
<requestFocus />
</EditText>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号"
android:id="@+id/et_number"
android:numeric="integer"
android:lines="1"
>
<requestFocus />
</EditText>
makeText用于交互弹窗
java实现如:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity{
public static final String tag="MainActivity";
private EditText mEtNumber;
private EditText mEtContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEtNumber=(EditText) MainActivity.this.findViewById(R.id.et_number);
mEtContent=(EditText) MainActivity.this.findViewById(R.id.et_content);
}
public void send(View view) {
//获取去除空白字符的手机号与短信内容
String number=mEtNumber.getText().toString().trim();
String content=mEtContent.getText().toString().trim();
//记录日志
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String time = formatter.format(curDate);
Log.i(tag,"测网速");
//发短信
if("".equals(number) || "".equals(content)){
/*
* 用于提示用户
* 第一个参数是上下文
* 第二个参数是提示内容,这里获取strings.xml中的定义的内容,也可以直接在这里写
* 第三个参数是提示内容过多久自动消失
* */
Toast.makeText(this,R.string.error_message,Toast.LENGTH_LONG).show();
}
}
}
布局如:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号"
android:id="@+id/et_number"
android:numeric="integer"
android:lines="1"
>
<requestFocus />
</EditText>
<!--短信内容一般比较多,输入框可以多允许几行输入-->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入短信内容"
android:id="@+id/et_content"
android:lines="4"
>
</EditText>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送"
android:id="@+id/send_button"
android:onClick="send"
/>
</LinearLayout>
用到的strings.xml
<resources>
<string name="app_name">My Application</string>
<string name="error_message">手机号和短信内容不能为空</string>
</resources>
这个提示也太low了。。
发送短信的实现
发送短信需要发送短信的权限,如果不知道需要什么权限,可以不加,然后发送短信失败时候会在错误日志中显示需要的权限。知道了需要的权限后加入到清单文件中
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
java的实现
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity{
public static final String tag="MainActivity";
private EditText mEtNumber;
private EditText mEtContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEtNumber=(EditText) MainActivity.this.findViewById(R.id.et_number);
mEtContent=(EditText) MainActivity.this.findViewById(R.id.et_content);
}
public void send(View view) {
//获取去除空白字符的手机号与短信内容
String number=mEtNumber.getText().toString().trim();
String content=mEtContent.getText().toString().trim();
//记录日志
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String time = formatter.format(curDate);
//发短信
if("".equals(number) || "".equals(content)){
Toast.makeText(this,R.string.error_message,Toast.LENGTH_LONG).show();
}
else{
Log.i(tag,"发送短信 接收者:"+number+" 内容:"+content);
SmsManager smsmanager=SmsManager.getDefault();
//接收者、发送者(可选)、发送内容、发送报告、送达报告(接收者成功接收)
smsmanager.sendTextMessage(number,null,content,null,null);
}
}
}
要发送短信,要知道对方的手机号,在模拟器中预置了每个虚拟设备的手机号,以Android 9设备为例,可以在这里找到对应设备的手机号
settings
system
about emulated device
phone number
那么可以利用这个手机号也能打电话(只取最后的“-”后面的数字做为手机号)
也可以直接在命令行中看到每个设备
C:\Users\Administrator>adb devices
List of devices attached
928QSEX222236 device
emulator-5554 device
其中模拟器设备的如emulator-5554的5554就是其手机号,可以用这个数字做为手机号为这个模拟器设备发送短信,上面显示的完整手机号,也可以只取最后的“-”后面的数字做为手机号发送短信,是否可以写完整的“手机号”,不晓得,没有测试过,这里只测试最后一段数字。
然后在部署有发短信程序中给其授权发短信权限
然后就可以成功发送短信了
收到短信的一方在短信中可以看到接收者的“电话号码”是加了前缀进行补全后显示在本短信中的
短信中的手机号是模拟器socket给做的前置字符串
也可以直接发回去,给它回复回去
日志猫的多设备
当将一个程序部署于多个设备中,日志猫每次只显示最后一次部署的设备的日志,如果想要看其它设备的日志,可在日志猫的设备下拉中选择对应设备。
据说:”选择对应设备时候会自动给激活对应设备的日志猫进程(如果对应日志猫进程假死、宕机等)”
短信的限制
发送短信,短信二字就注定了内容不能太长,像是这样很多字符的内容就无法发送成功
者限制据说是纯中文70,纯英文60,混合的情况下,这个就难说了。。。。
查看其构造发现其提供一个可以将短信内容进行拆分的方法
所以可以突破短信内容太大时候的发送限制了,就是拆分为多条短信进行发送
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class MainActivity extends AppCompatActivity{
public static final String tag="MainActivity";
private EditText mEtNumber;
private EditText mEtContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEtNumber=(EditText) MainActivity.this.findViewById(R.id.et_number);
mEtContent=(EditText) MainActivity.this.findViewById(R.id.et_content);
}
public void send(View view) {
//获取去除空白字符的手机号与短信内容
String number=mEtNumber.getText().toString().trim();
String content=mEtContent.getText().toString().trim();
//记录日志
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String time = formatter.format(curDate);
//发短信
if("".equals(number) || "".equals(content)){
Toast.makeText(this,R.string.error_message,Toast.LENGTH_LONG).show();
}
else{
Log.i(tag,"发送短信 接收者:"+number+" 内容:"+content);
SmsManager smsmanager=SmsManager.getDefault();
//查看其构造发现其提供一个拆分短信的方法divideMessage
ArrayList<String> messages=smsmanager.divideMessage(content);
for(String message:messages){
smsmanager.sendTextMessage(number,null,message,null,null);
}
}
}
}
ok,发送成功
设备选择与项目sdk版本、设备/模拟器(虚拟机)的sdk版本的关系
当有多个模拟器/设备时候,若存在多个不同的设备的api版本各不相同的时候,可用设备列表中最上面显示的是当前正在运行在哪些设备,而avaiable devices显示的是可用列表,可用列表中低于当前项目sdk的会被标记为当前项目大于目标设备,那么反之应该就是被标记为当前项目sdk小于目标设备sdk
没有带标记的就是可以直接运行的,在老版本中还有是否在线等
对于上面设备大于当前项目最小兼容的sdk可以这样测试,可以先在这里设置当前项目兼容的最小sdk降低到目前已经创建的虚拟设备的sdk版本之下(之前项目设置的最小兼容sdk是安卓9.0(api28)),现在直接给它改成api8
看来和我们的猜想不一样呢,这么多设备都全部支持了。。。打脸了。。。
关键字词:android,短信
下一篇:12_常用的一些布局简洁