新增:转发到PushPlus

This commit is contained in:
pppscn 2021-11-22 13:55:44 +08:00
parent 2173861913
commit a820971ee3
25 changed files with 634 additions and 114 deletions

1
.gitignore vendored
View File

@ -19,3 +19,4 @@ gradle.properties
/app/release
/keystore
*.bak
/pic/working_principle.drawio

View File

@ -1,6 +1,6 @@
# SmsForwarder (短信转发器)
监控Android手机短信并根据指定规则转发到其他手机钉钉机器人、企业微信群机器人、飞书机器人、企业微信应用消息、邮箱、bark、webhook、Telegram机器人、Server酱、手机短信等。
短信转发器——监控Android手机短信、来电、APP通知并根据指定规则转发到其他手机钉钉机器人、企业微信群机器人、飞书机器人、企业微信应用消息、邮箱、bark、webhook、Telegram机器人、Server酱、PushPlus、手机短信等。
> ⚠ 首发地址https://github.com/pppscn/SmsForwarder
@ -24,7 +24,7 @@
## 特点和准则:
* **简单** 只做两件事:监听短信 --> 根据指定规则转发
* **简单** 只做两件事:监听手机短信/来电/APP通知 --> 根据指定规则转发
由此带来的好处:
@ -63,20 +63,20 @@
- [x] 接口请求失败后延时重试5次可配置间隔时间成功一次则终止重试
- [x] 转发到飞书机器人
- [x] 自定义 Schemeforwarder://main用于唤起App
- [x] 低电量预警设置30%则30、29时都通知一下避免错过按需设置一下转发规则不再遍历所有发送【号码88888888、内容当前剩余电量xx%已经到达低电量预警阈值请及时充电、卡槽sim1】
- [x] 低电量预警设置30%则30、29时都通知一下避免错过按需设置一下转发规则不再遍历所有发送通道【号码88888888、内容当前剩余电量xx%已经到达低电量预警阈值请及时充电、卡槽sim1】
- [x] 多语言支持(目前:中文、英文)
- [x] 增加配置导出导入功能(一键克隆)
- [x] 监听其他APP通知信息并转发
- [x] 添加转发规则时允许自定义模板(留空则取全局设置)
- [x] 转发到PushPlus
### 使用流程:
1. 在Android手机上安装`SmsForwarder`本APP后点击应用图标打开
2. 在设置发送方页面,添加或点击已添加的发送方来设置转发短信使用的方式现在支持钉钉机器人、企业微信群机器人、企业微信应用消息、邮箱、bark、webhook、Telegram机器人、Server酱
> 发送方配置见《发送方设置参考》章节
2. 在设置发送通道页面,添加或点击已添加的发送通道来设置转发短信使用的方式现在支持钉钉机器人、企业微信群机器人、企业微信应用消息、邮箱、bark、webhook、Telegram机器人、Server酱
> 发送通道配置见《发送通道设置参考》章节
3. 在设置转发规则页面,添加或点击已添加的转发规则来设置转发什么样的短信,现在支持转发全部、根据手机号、根据短信内容、指定卡槽:
+ 当设置转发全部时,所以接收到的短信都会用转发出去。
+ 当设置根据手机号或短信内容时,请设置匹配的模式和值,例如:”手机号 是 10086 发送选钉钉“。
+ 当设置根据手机号或短信内容时,请设置匹配的模式和值,例如:”手机号 是 10086 发送通道选钉钉“。
4. 点击主页面右上角的菜单可进入设置页面,在设置页面可以更新应用查看应用信息提交意见反馈等
5. 在主页面下拉可刷新转发的短信,点击清空记录可删除转发的记录
@ -105,7 +105,7 @@
4. adb进行授权 ```adb attach``` 然后允许授权
5. 配置定时任务每分钟执行命令 ```adb shell am start -n com.idormy.sms.forwarder/com.idormy.sms.forwarder.MainActivity```
### 发送设置参考
### 发送通道设置参考
#### 钉钉机器人
@ -186,21 +186,30 @@
* 【可选】安全设置->签名校验,复制到「加签 Secret」一栏
* 点击【测试】按钮验证一下
#### PushPlus
* 前往 [PushPlus 官网](http://www.pushplus.plus)
* 根据自身需求选择 [一对一推送](http://www.pushplus.plus/push1.html) 或 [一对多推送](http://www.pushplus.plus/push2.html)
* 微信扫码登录获取token填写到「用户令牌」一栏
* 【可选】其他可选参数参见 [一对多推送](http://www.pushplus.plus/doc/guide/api.html#%E4%B8%80%E3%80%81%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3)
* 点击【测试】按钮验证一下
### 应用截图:
| 前台服务常驻状态栏 | 应用主界面 | 转发规则 | 转发详情 |
| ---- | ---- | ---- | ---- |
| ![前台服务常驻状态栏](pic/taskbar.jpg "前台服务常驻状态栏") | ![应用主界面](pic/main.png "应用主界面") | ![转发规则](pic/rule.jpg "转发规则") | ![转发详情](pic/maindetail.jpg "转发详情") |
| 添加/编辑转发规则测试 | 多重匹配规则 | 支持以下转发方式(发送方) | 添加/编辑发送方钉钉 |
| ![添加/编辑转发规则](pic/ruleset.png "添加/编辑转发规则") | ![多重匹配规则](pic/multimatch.png "多重匹配规则") | ![发送方](pic/sender.jpg "发送方") | ![添加/编辑发送方钉钉](pic/sendersetdingding.jpg "添加/编辑发送方钉钉") |
| 添加/编辑发送方邮箱 | 添加/编辑发送方Bark | 添加/编辑发送方网页通知 | 添加/编辑发送方企业微信群机器人 |
| ![添加/编辑发送方邮箱](pic/sendersetemail.jpg "添加/编辑发送方邮箱") | ![添加/编辑发送方Bark](pic/sendersetbark.png "添加/编辑发送方Bark") | ![添加/编辑发送方网页通知](pic/sendersetwebnotify.jpg "添加/编辑发送方网页通知") | ![添加/编辑发送方企业微信群机器人](pic/sendersetqywechat.jpg "添加/编辑发送方企业微信群机器人") |
| 添加/编辑发送方Telegram机器人 | 添加/编辑发送方Server酱·Turbo版 | 添加/编辑发送方企业微信应用 | 应用设置 |
| ![添加/编辑发送方Telegram机器人](pic/sendertelegram.jpg "添加/编辑发送方Telegram机器人") | ![添加/编辑发送方Server酱·Turbo版](pic/senderserverchan.jpg "添加/编辑发送方Server酱·Turbo版") | ![添加/编辑发送方企业微信应用](pic/sendersetqywxapp.jpg "添加/编辑发送方企业微信应用") | ![应用设置](pic/setting.jpg "应用设置") |
| 关于/在线升级 | 支持正则匹配规则 & 支持卡槽匹配规则 | 转发短信模板增加卡槽标识 | 添加/编辑发送其他手机短信 |
| ![在线升级](pic/update.jpg "在线升级") | ![支持正则匹配规则 & 支持卡槽匹配规则](pic/regex.jpg "支持正则匹配规则 & 支持卡槽匹配规则") | ![转发短信模板增加卡槽标识](pic/siminfo.jpg "转发短信模板增加卡槽标识") | ![添加/编辑发送方其他手机短信](pic/sendersetsms.jpg "添加/编辑发送方其他手机短信") |
| 添加/编辑发送飞书机器人 | 增加配置导出导入功能(一键克隆) | 监听其他APP通知信息并转发 | 获取所有应用列表方便复制APP包名|
| ![添加/编辑发送方飞书](pic/senderfeishu.png "添加/编辑发送方飞书") | ![增加配置导出导入功能(一键克隆)](pic/clone.png "增加配置导出导入功能(一键克隆)") | ![监听其他APP通知信息并转发](pic/app_notify.png "监听其他APP通知信息并转发") | ![获取所有应用列表方便复制APP包名](pic/app_list.png "获取所有应用列表方便复制APP包名") |
| 添加/编辑转发规则测试 | 多重匹配规则 | 支持以下转发方式(发送通道) | 添加/编辑发送通道钉钉 |
| ![添加/编辑转发规则](pic/ruleset.png "添加/编辑转发规则") | ![多重匹配规则](pic/multimatch.png "多重匹配规则") | ![发送通道](pic/sender.jpg "发送通道") | ![添加/编辑发送通道钉钉](pic/sendersetdingding.jpg "添加/编辑发送通道钉钉") |
| 添加/编辑发送通道邮箱 | 添加/编辑发送通道Bark | 添加/编辑发送通道网页通知 | 添加/编辑发送通道企业微信群机器人 |
| ![添加/编辑发送通道邮箱](pic/sendersetemail.jpg "添加/编辑发送通道邮箱") | ![添加/编辑发送通道Bark](pic/sendersetbark.png "添加/编辑发送通道Bark") | ![添加/编辑发送通道网页通知](pic/sendersetwebnotify.jpg "添加/编辑发送通道网页通知") | ![添加/编辑发送通道企业微信群机器人](pic/sendersetqywechat.jpg "添加/编辑发送通道企业微信群机器人") |
| 添加/编辑发送通道Telegram机器人 | 添加/编辑发送通道Server酱·Turbo版 | 添加/编辑发送通道企业微信应用 | 应用设置 |
| ![添加/编辑发送通道Telegram机器人](pic/sendertelegram.jpg "添加/编辑发送通道Telegram机器人") | ![添加/编辑发送通道Server酱·Turbo版](pic/senderserverchan.jpg "添加/编辑发送通道Server酱·Turbo版") | ![添加/编辑发送通道企业微信应用](pic/sendersetqywxapp.jpg "添加/编辑发送通道企业微信应用") | ![应用设置](pic/setting.jpg "应用设置") |
| 关于/在线升级 | 支持正则匹配规则 & 支持卡槽匹配规则 | 转发短信模板增加卡槽标识 | 添加/编辑发送通道其他手机短信 |
| ![在线升级](pic/update.jpg "在线升级") | ![支持正则匹配规则 & 支持卡槽匹配规则](pic/regex.jpg "支持正则匹配规则 & 支持卡槽匹配规则") | ![转发短信模板增加卡槽标识](pic/siminfo.jpg "转发短信模板增加卡槽标识") | ![添加/编辑发送通道其他手机短信](pic/sendersetsms.jpg "添加/编辑发送通道其他手机短信") |
| 添加/编辑发送通道飞书机器人 | 增加配置导出导入功能(一键克隆) | 监听其他APP通知信息并转发 | 获取所有应用列表方便复制APP包名|
| ![添加/编辑发送通道飞书](pic/senderfeishu.png "添加/编辑发送通道飞书") | ![增加配置导出导入功能(一键克隆)](pic/clone.png "增加配置导出导入功能(一键克隆)") | ![监听其他APP通知信息并转发](pic/app_notify.png "监听其他APP通知信息并转发") | ![获取所有应用列表方便复制APP包名](pic/app_list.png "获取所有应用列表方便复制APP包名") |
--------
@ -228,14 +237,14 @@
+ [v1.6.4] Android8.1以下手机重启后尝试启动主界面,以便动态获取权限(修复开机自启后无法转发短信,要打开软件后才会转发短信的问题)
+ [v1.7.0] 新增转发到其他手机短信 & 避免热插卡时FC & 规则展示优化 & 获取多卡信息&获取卡槽备注优化 & 新增恢复初始化配置
+ [v1.7.1] 新增转发记录的转发状态(成功/失败&应答信息)
+ [v1.7.2] 新增V1版证书签名避免部分低版本系统(Android 6.x)无证书错误 & 发送邮箱允许自定义发件人昵称
+ [v1.7.2] 新增V1版证书签名避免部分低版本系统(Android 6.x)无证书错误 & 发送通道邮箱允许自定义发件人昵称
+ [v1.7.3] 修复“设置匹配模式”默认选择BUG & 转发到webhook时返回http状态200即为成功 & 转发到其他手机短信支持长短信合并
+ [v1.7.4] 修复转发企业微信群机器人碰到"被截断问题 & 转发到webhook时忽略ssl证书校验提高自建服务端兼容性 & 转发telegram时将 # 替换为 井,避免被当作标签 & 隐私保护,发送设置中敏感信息(密码/token/secret等)用星号显示 & 更新友盟基础组件库 & 解决“设置页面关闭卡槽信息,同时使用默认模板时,发送消息卡槽信息仍显示”
+ [v1.7.4] 修复转发企业微信群机器人碰到"被截断问题 & 转发到webhook时忽略ssl证书校验提高自建服务端兼容性 & 转发telegram时将 # 替换为 井,避免被当作标签 & 隐私保护,发送通道设置中敏感信息(密码/token/secret等)用星号显示 & 更新友盟基础组件库 & 解决“设置页面关闭卡槽信息,同时使用默认模板时,发送消息卡槽信息仍显示”
+ [v2.0.0] 来电提醒转发 & 接口请求失败后延时重试5次可配置间隔时间& 转发到飞书机器人 & 自定义 Schemeforwarder://main用于唤起App & 低电量预警 & 重新梳理代码消灭waring& Bark增加支持分组 & 引入Lombok & 升级gradle版本 & 增加电池优化白名单设置和权限 & 转发到webhook增加支持自定义post数据并支持Json数据提交
+ [v2.0.1] 改进低电量预警方式,按需设置一下转发规则(不再遍历所有发送【号码88888888、内容当前剩余电量xx%已经到达低电量预警阈值请及时充电、卡槽sim1】
+ [v2.0.1] 改进低电量预警方式,按需设置一下转发规则(不再遍历所有发送通道【号码88888888、内容当前剩余电量xx%已经到达低电量预警阈值请及时充电、卡槽sim1】
+ [v2.1.0] 增加配置导出导入功能(一键克隆) & bark新增指定推送消息图标 & 简化设置,取消“转发时附加卡槽信息”和“转发时附加设备名称”开关,若需要直接修改“转发信息模板” & 修复转发未接来电开关失效问题
+ [v2.1.1] fix自定义模板&匹配的值输入框支持多行文本 & fix取消“转发时附加卡槽信息”和“转发时附加设备名称”开关
+ [v2.2.0] 新增监听其他APP通知信息并根据规则转发 & 修复Telegram手机号丢失问题 & 优化:来电转发增加获取卡槽信息 & 优化Telegram转发支持自定义bot地址(复用ApiToken字段http开头) & 新增:添加转发规则时允许自定义模板(留空则取全局设置) & 修复bark指定推送消息图标空指针判断bug & 新增:转发短信总开关 & 优化ActionBar弹出菜单的位置 & 新增获取所有应用列表方便复制APP包名
+ [v2.2.0] 新增监听其他APP通知信息并根据规则转发 & 修复Telegram手机号丢失问题 & 优化:来电转发增加获取卡槽信息 & 优化Telegram转发支持自定义bot地址(复用ApiToken字段http开头) & 新增:添加转发规则时允许自定义模板(留空则取全局设置) & 修复bark指定推送消息图标空指针判断bug & 新增:转发短信总开关 & 优化ActionBar弹出菜单的位置 & 新增获取所有应用列表方便复制APP包名 & 新增转发到PushPlus & 新增帮助文档跳转Gitee的wiki& 优化:不在最近任务列表中显示(利于措施)
--------
@ -257,7 +266,6 @@
+ https://github.com/xuexiangjys/XUpdateAPI (在线升级)
+ https://github.com/mailhu/emailkit (邮件发送)
+ https://github.com/alibaba/fastjson (Json解析)
+ https://github.com/lilongweidev/NotifyListenerDemo (手机通知服务)
## LICENSE

View File

@ -148,9 +148,7 @@ public class AppListActivity extends AppCompatActivity {
// 通过packName得到PackageInfo作为参数传入即可
private boolean isSystemApp(PackageInfo pi) {
boolean isSysApp = (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1;
boolean isSysUpd = (pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1;
return isSysApp || isSysUpd;
return (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1;
}
@Override

View File

@ -65,7 +65,7 @@ public class MyApplication extends Application {
SharedPreferences sp = MyApplication.this.getSharedPreferences(Define.SP_CONFIG, Context.MODE_PRIVATE);
showHelpTip = sp.getBoolean(Define.SP_CONFIG_SWITCH_HELP_TIP, true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && SettingUtil.getExcludeFromRecents()) {
if (SettingUtil.getExcludeFromRecents()) {
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
if (am != null) {
List<ActivityManager.AppTask> appTasks = am.getAppTasks();

View File

@ -5,6 +5,7 @@ import static com.idormy.sms.forwarder.model.SenderModel.TYPE_BARK;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_DINGDING;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_EMAIL;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_FEISHU;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_PUSHPLUS;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_APP;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_GROUP_ROBOT;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_SERVER_CHAN;
@ -37,6 +38,7 @@ import com.idormy.sms.forwarder.model.vo.BarkSettingVo;
import com.idormy.sms.forwarder.model.vo.DingDingSettingVo;
import com.idormy.sms.forwarder.model.vo.EmailSettingVo;
import com.idormy.sms.forwarder.model.vo.FeiShuSettingVo;
import com.idormy.sms.forwarder.model.vo.PushPlusSettingVo;
import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo;
import com.idormy.sms.forwarder.model.vo.QYWXGroupRobotSettingVo;
import com.idormy.sms.forwarder.model.vo.ServerChanSettingVo;
@ -47,6 +49,7 @@ import com.idormy.sms.forwarder.sender.SenderBarkMsg;
import com.idormy.sms.forwarder.sender.SenderDingdingMsg;
import com.idormy.sms.forwarder.sender.SenderFeishuMsg;
import com.idormy.sms.forwarder.sender.SenderMailMsg;
import com.idormy.sms.forwarder.sender.SenderPushPlusMsg;
import com.idormy.sms.forwarder.sender.SenderQyWxAppMsg;
import com.idormy.sms.forwarder.sender.SenderQyWxGroupRobotMsg;
import com.idormy.sms.forwarder.sender.SenderServerChanMsg;
@ -142,6 +145,9 @@ public class SenderActivity extends AppCompatActivity {
case TYPE_FEISHU:
setFeiShu(senderModel);
break;
case TYPE_PUSHPLUS:
setPushPlus(senderModel);
break;
default:
Toast.makeText(SenderActivity.this, R.string.invalid_sender, Toast.LENGTH_LONG).show();
SenderUtil.delSender(senderModel.getId());
@ -217,6 +223,9 @@ public class SenderActivity extends AppCompatActivity {
case TYPE_FEISHU:
setFeiShu(null);
break;
case TYPE_PUSHPLUS:
setPushPlus(null);
break;
default:
Toast.makeText(SenderActivity.this, R.string.not_supported, Toast.LENGTH_LONG).show();
break;
@ -1180,6 +1189,119 @@ public class SenderActivity extends AppCompatActivity {
});
}
//推送加
@SuppressLint("SimpleDateFormat")
private void setPushPlus(final SenderModel senderModel) {
PushPlusSettingVo pushPlusSettingVo = null;
//try phrase json setting
if (senderModel != null) {
String jsonSettingStr = senderModel.getJsonSetting();
if (jsonSettingStr != null) {
pushPlusSettingVo = JSON.parseObject(jsonSettingStr, PushPlusSettingVo.class);
}
}
final AlertDialog.Builder alertDialog71 = new AlertDialog.Builder(SenderActivity.this);
View view1 = View.inflate(SenderActivity.this, R.layout.alert_dialog_setview_pushplus, null);
final EditText editTextPushPlusName = view1.findViewById(R.id.editTextPushPlusName);
final EditText editTextPushPlusToken = view1.findViewById(R.id.editTextPushPlusToken);
final EditText editTextPushPlusTopic = view1.findViewById(R.id.editTextPushPlusTopic);
final EditText editTextPushPlusTemplate = view1.findViewById(R.id.editTextPushPlusTemplate);
final EditText editTextPushPlusChannel = view1.findViewById(R.id.editTextPushPlusChannel);
final EditText editTextPushPlusWebhook = view1.findViewById(R.id.editTextPushPlusWebhook);
final EditText editTextPushPlusCallbackUrl = view1.findViewById(R.id.editTextPushPlusCallbackUrl);
if (pushPlusSettingVo != null) {
editTextPushPlusName.setText(senderModel.getName());
editTextPushPlusToken.setText(pushPlusSettingVo.getToken());
editTextPushPlusTopic.setText(pushPlusSettingVo.getTopic());
editTextPushPlusTemplate.setText(pushPlusSettingVo.getTemplate());
editTextPushPlusChannel.setText(pushPlusSettingVo.getChannel());
editTextPushPlusWebhook.setText(pushPlusSettingVo.getWebhook());
editTextPushPlusCallbackUrl.setText(pushPlusSettingVo.getCallbackUrl());
}
Button buttonPushPlusOk = view1.findViewById(R.id.buttonPushPlusOk);
Button buttonPushPlusDel = view1.findViewById(R.id.buttonPushPlusDel);
Button buttonPushPlusTest = view1.findViewById(R.id.buttonPushPlusTest);
alertDialog71
.setTitle(R.string.setpushplustitle)
.setIcon(R.mipmap.pushplus)
.setView(view1)
.create();
final AlertDialog show = alertDialog71.show();
buttonPushPlusOk.setOnClickListener(view -> {
if (senderModel == null) {
SenderModel newSenderModel = new SenderModel();
newSenderModel.setName(editTextPushPlusName.getText().toString());
newSenderModel.setType(TYPE_PUSHPLUS);
newSenderModel.setStatus(STATUS_ON);
PushPlusSettingVo pushPlusSettingVoNew = new PushPlusSettingVo(
editTextPushPlusToken.getText().toString(),
editTextPushPlusTopic.getText().toString(),
editTextPushPlusTemplate.getText().toString(),
editTextPushPlusChannel.getText().toString(),
editTextPushPlusWebhook.getText().toString(),
editTextPushPlusCallbackUrl.getText().toString()
);
newSenderModel.setJsonSetting(JSON.toJSONString(pushPlusSettingVoNew));
SenderUtil.addSender(newSenderModel);
initSenders();
adapter.add(senderModels);
} else {
senderModel.setName(editTextPushPlusName.getText().toString());
senderModel.setType(TYPE_PUSHPLUS);
senderModel.setStatus(STATUS_ON);
PushPlusSettingVo pushPlusSettingVoNew = new PushPlusSettingVo(
editTextPushPlusToken.getText().toString(),
editTextPushPlusTopic.getText().toString(),
editTextPushPlusTemplate.getText().toString(),
editTextPushPlusChannel.getText().toString(),
editTextPushPlusWebhook.getText().toString(),
editTextPushPlusCallbackUrl.getText().toString()
);
senderModel.setJsonSetting(JSON.toJSONString(pushPlusSettingVoNew));
SenderUtil.updateSender(senderModel);
initSenders();
adapter.update(senderModels);
}
show.dismiss();
});
buttonPushPlusDel.setOnClickListener(view -> {
if (senderModel != null) {
SenderUtil.delSender(senderModel.getId());
initSenders();
adapter.del(senderModels);
}
show.dismiss();
});
buttonPushPlusTest.setOnClickListener(view -> {
PushPlusSettingVo pushPlusSettingVoNew = new PushPlusSettingVo(
editTextPushPlusToken.getText().toString(),
editTextPushPlusTopic.getText().toString(),
editTextPushPlusTemplate.getText().toString(),
editTextPushPlusChannel.getText().toString(),
editTextPushPlusWebhook.getText().toString(),
editTextPushPlusCallbackUrl.getText().toString()
);
String token = pushPlusSettingVoNew.getToken();
if (token != null && !token.isEmpty()) {
try {
SenderPushPlusMsg.sendMsg(0, handler, pushPlusSettingVoNew, "SmsForwarder", getString(R.string.test_content) + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())));
} catch (Exception e) {
Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
} else {
Toast.makeText(SenderActivity.this, R.string.invalid_token, Toast.LENGTH_LONG).show();
}
});
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");

View File

@ -21,6 +21,7 @@ public class SenderModel {
public static final int TYPE_TELEGRAM = 7;
public static final int TYPE_SMS = 8;
public static final int TYPE_FEISHU = 9;
public static final int TYPE_PUSHPLUS = 10;
private Long id;
private String name;
private int status;
@ -58,6 +59,8 @@ public class SenderModel {
return R.mipmap.telegram;
case (TYPE_FEISHU):
return R.mipmap.feishu;
case (TYPE_PUSHPLUS):
return R.mipmap.pushplus;
case (TYPE_SMS):
default:
return R.mipmap.sms;
@ -84,6 +87,8 @@ public class SenderModel {
return R.mipmap.telegram;
case (TYPE_FEISHU):
return R.mipmap.feishu;
case (TYPE_PUSHPLUS):
return R.mipmap.pushplus;
case (TYPE_SMS):
default:
return R.mipmap.sms;

View File

@ -0,0 +1,27 @@
package com.idormy.sms.forwarder.model.vo;
import java.io.Serializable;
import lombok.Data;
@Data
public class PushPlusSettingVo implements Serializable {
private String token;
private String topic;
private String template;
private String channel;
private String webhook;
private String callbackUrl;
public PushPlusSettingVo() {
}
public PushPlusSettingVo(String token, String topic, String template, String channel, String webhook, String callbackUrl) {
this.token = token;
this.topic = topic;
this.template = template;
this.channel = channel;
this.webhook = webhook;
this.callbackUrl = callbackUrl;
}
}

View File

@ -4,6 +4,7 @@ import static com.idormy.sms.forwarder.model.SenderModel.TYPE_BARK;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_DINGDING;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_EMAIL;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_FEISHU;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_PUSHPLUS;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_APP;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_GROUP_ROBOT;
import static com.idormy.sms.forwarder.model.SenderModel.TYPE_SERVER_CHAN;
@ -23,6 +24,7 @@ import com.idormy.sms.forwarder.model.vo.BarkSettingVo;
import com.idormy.sms.forwarder.model.vo.DingDingSettingVo;
import com.idormy.sms.forwarder.model.vo.EmailSettingVo;
import com.idormy.sms.forwarder.model.vo.FeiShuSettingVo;
import com.idormy.sms.forwarder.model.vo.PushPlusSettingVo;
import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo;
import com.idormy.sms.forwarder.model.vo.QYWXGroupRobotSettingVo;
import com.idormy.sms.forwarder.model.vo.ServerChanSettingVo;
@ -272,6 +274,21 @@ public class SendUtil {
}
break;
case TYPE_PUSHPLUS:
//try phrase json setting
if (senderModel.getJsonSetting() != null) {
PushPlusSettingVo pushPlusSettingVo = JSON.parseObject(senderModel.getJsonSetting(), PushPlusSettingVo.class);
if (pushPlusSettingVo != null) {
try {
SenderPushPlusMsg.sendMsg(logId, handError, pushPlusSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage());
}
}
}
break;
default:
break;
}

View File

@ -0,0 +1,128 @@
package com.idormy.sms.forwarder.sender;
import android.os.Handler;
import android.util.Log;
import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.model.vo.PushPlusSettingVo;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"})
public class SenderPushPlusMsg extends SenderBaseMsg {
static final String TAG = "SenderFeishuMsg";
public static void sendMsg(final long logId, final Handler handError, PushPlusSettingVo pushPlusSettingVo, String title, String content) throws Exception {
//用户令牌
String token = pushPlusSettingVo.getToken();
if (token == null || token.isEmpty()) return;
Map textMsgMap = new HashMap();
//消息标题
if (title != null && !title.isEmpty()) textMsgMap.put("title", title);
//具体消息内容
if (content == null || content.isEmpty()) return;
textMsgMap.put("content", content);
//群组编码不填仅发送给自己channel为webhook时无效
String topic = pushPlusSettingVo.getTopic();
if (topic != null && !topic.isEmpty()) textMsgMap.put("topic", topic);
//发送模板
String template = pushPlusSettingVo.getTemplate();
if (template != null && !template.isEmpty()) textMsgMap.put("template", template);
//发送渠道
String channel = pushPlusSettingVo.getChannel();
if (channel != null && !channel.isEmpty()) textMsgMap.put("channel", channel);
//webhook编码仅在channel使用webhook渠道和CP渠道时需要填写
String webhook = pushPlusSettingVo.getChannel();
if (webhook != null && !webhook.isEmpty()) textMsgMap.put("webhook", webhook);
//发送结果回调地址
String callbackUrl = pushPlusSettingVo.getCallbackUrl();
if (callbackUrl != null && !callbackUrl.isEmpty()) textMsgMap.put("callbackUrl", callbackUrl);
//毫秒时间戳格式如1632993318000服务器时间戳大于此时间戳则消息不会发送
textMsgMap.put("timestamp", System.currentTimeMillis());
final String requestUrl = "http://www.pushplus.plus/send/" + token;
Log.i(TAG, "requestUrl:" + requestUrl);
final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":200")) {
LogUtil.updateLog(logId, 1, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
}
}

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@ -86,7 +87,8 @@
android:onClick="addRule"
android:tag="sms"
android:padding="0dp"
android:text="@string/new_sms_rule" />
android:text="@string/new_sms_rule"
tools:ignore="ButtonStyle,UsingOnClickInXml" />
<Button
android:layout_width="match_parent"
@ -99,7 +101,8 @@
android:onClick="addRule"
android:tag="call"
android:padding="0dp"
android:text="@string/new_call_rule" />
android:text="@string/new_call_rule"
tools:ignore="ButtonStyle,UsingOnClickInXml" />
<Button
android:layout_width="match_parent"
@ -113,7 +116,8 @@
android:onClick="addRule"
android:tag="app"
android:padding="0dp"
android:text="@string/new_app_rule" />
android:text="@string/new_app_rule"
tools:ignore="ButtonStyle,UsingOnClickInXml" />
</LinearLayout>
</LinearLayout>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@ -31,7 +32,8 @@
android:background="@color/colorPrimary"
android:onClick="addSender"
android:padding="0dp"
android:text="@string/new_sender" />
android:text="@string/new_sender"
tools:ignore="UsingOnClickInXml" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,215 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/set_name" />
<EditText
android:id="@+id/editTextPushPlusName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:autofillHints=""
android:ems="14"
android:inputType="text"
android:text=""
tools:ignore="LabelFor,TextFields" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pushplus_token" />
<EditText
android:id="@+id/editTextPushPlusToken"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:autofillHints=""
android:ems="14"
android:inputType="textPassword"
android:text=""
tools:ignore="LabelFor,TextFields" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pushplus_topic" />
<EditText
android:id="@+id/editTextPushPlusTopic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:autofillHints=""
android:ems="14"
android:inputType="text"
android:text=""
tools:ignore="LabelFor" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pushplus_template" />
<EditText
android:id="@+id/editTextPushPlusTemplate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:autofillHints=""
android:ems="14"
android:inputType="text"
android:text="@string/html"
tools:ignore="LabelFor,TextFields" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pushplus_channel" />
<EditText
android:id="@+id/editTextPushPlusChannel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:autofillHints=""
android:ems="14"
android:inputType="text"
android:text="@string/wechat"
tools:ignore="LabelFor,TextFields" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pushplus_webhook" />
<EditText
android:id="@+id/editTextPushPlusWebhook"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:autofillHints=""
android:ems="14"
android:inputType="text"
android:text=""
tools:ignore="LabelFor" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pushplus_callback" />
<EditText
android:id="@+id/editTextPushPlusCallbackUrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:autofillHints=""
android:ems="14"
android:inputType="textUri"
android:text=""
tools:ignore="LabelFor" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:orientation="horizontal">
<Button
android:id="@+id/buttonPushPlusTest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_weight="1"
android:text="@string/test"
tools:ignore="ButtonStyle,NestedWeights" />
<Button
android:id="@+id/buttonPushPlusDel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_weight="1"
android:text="@string/del"
tools:ignore="ButtonStyle,NestedWeights" />
<Button
android:id="@+id/buttonPushPlusOk"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/ok"
tools:ignore="ButtonStyle,NestedWeights" />
</LinearLayout>
</LinearLayout>
</ScrollView>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -11,5 +11,6 @@
<item>Telegram Bot</item>
<item>SMS</item>
<item>FeiShu Bot</item>
<item>PushPlus</item>
</string-array>
</resources>

View File

@ -3,17 +3,7 @@
<color name="colorPrimary">#1C8DD4</color>
<color name="colorPrimaryDark">#1B8DD4</color>
<color name="colorAccent">#63C2FA</color>
<color name="colorBlueGreyLight">#B0BBC5</color>
<color name="colorBlueGrey">#78909C</color>
<color name="colorBlueGreyDark">#546E7A</color>
<color name="white">#ffffff</color>
<color name="black">#000000</color>
<color name="line_gray">#dcdcdc</color>
<color name="line_gray_light">#f1f1f1</color>
<color name="gray_page_bg">#ecedf1</color>
<color name="gray_text">#5b5b5b</color>
<color name="gray_text_dark">#292929</color>
<color name="gray_text_light">#979797</color>
<color name="window_half_transparent">#90000000</color>
<color name="blue_white">#0eabe5</color>
</resources>

View File

@ -99,6 +99,7 @@
<string name="settelegramtitle">Telegram Bot Settings</string>
<string name="setsmstitle">SMS Settings</string>
<string name="setfeishutitle">FeiShu Bot Settings</string>
<string name="setpushplustitle">PushPlus Settings</string>
<string name="test_phone_num">19999999999</string>
<string name="test_content">Test content @</string>
<string name="test_sms">【JD】code 387481, ihelp.jd.com</string>
@ -147,7 +148,7 @@
<string name="SmsSimSlot">Sim Slot</string>
<string name="same_source">Same source</string>
<string name="SmsMobiles">Receive mobile phone numbers separated by, e.g. 15888888888;19999999999</string>
<string name="OnlyNoNetwork">仅当无网络时启用</string>
<string name="OnlyNoNetwork">Enable when no network is available</string>
<!--SettingActivity-->
<string name="device_name">Device name</string>
<string name="sim1_remark" tools:ignore="Typos">SIM1 Remark</string>
@ -157,18 +158,16 @@
<string name="low_power_alarm_threshold_tips">Value range: 0100. Left blank or 0 is disabled</string>
<string name="retry_interval">Retry interval (seconds)</string>
<string name="retry_interval_tips">Retry five times after it fails</string>
<string name="add_extra">Sim slot info attached</string>
<string name="add_device_name">Device Name attached</string>
<string name="forward_sms">Forward sms</string>
<string name="forward_sms_tips">总开关,请授予读取短信、通知类短信、发送短信等权限,开启后需添加转发规则</string>
<string name="forward_sms_tips">Main switch, grant the permission to read short messages, notify short messages, and send short messages</string>
<string name="forward_missed_calls">Forward missed calls</string>
<string name="forward_missed_calls_tips">总开关,请授予读取通话记录、联系人等权限,开启后需添加转发规则</string>
<string name="forward_missed_calls_tips">Main switch, please grant read call history, contact rights</string>
<string name="forward_app_notify">Forward app notify</string>
<string name="forward_app_notify_tips">总开关,请先授予通知使用权,开启后需添加转发规则</string>
<string name="forward_app_notify_tips">Master switch, please grant notice first</string>
<string name="enable_custom_templates">Enable custom templates</string>
<string name="enable_custom_templates_tips">全局自定义模版,如果添加转发规则再次定义,则优先取转发规则的</string>
<string name="enable_custom_templates_tips">Priority: custom template for forwarding rules >Global custom template >The default</string>
<string name="enable_exclude_from_recents">Exclude from recents</string>
<string name="enable_exclude_from_recents_tips">开启后,有效避免手动误杀进程,利于保活?</string>
<string name="enable_exclude_from_recents_tips">After this function is enabled, manual killing of processes is effectively avoided, which helps to keep the process alive</string>
<string name="custom_templates">Custom templates</string>
<string name="custom_templates_tips">TipInsert labels as needed;Leave blank to default template</string>
<string name="insert_sender">Phone</string>
@ -212,7 +211,6 @@
<string name="sender_cannot_receive">This mobile phone is the sender and cannot receive files.</string>
<string name="no_wifi_network">If the Wifi network is not connected, the one-click cloning function cannot be used.</string>
<string name="invalid_server_ip">Please enter a valid server IP address</string>
<string name="download_failed">Download Failed</string>
<string name="download_success">Download Success</string>
<string name="on_wireless_network">Currently on a wireless network</string>
<string name="on_mobile_network">Currently on a mobile network</string>
@ -225,8 +223,16 @@
<string name="appicon">App Icon</string>
<string name="user_app">User App</string>
<string name="system_app">System App</string>
<string name="tips_battery_optimization">请将省电优化设置为无限制(不优化),有利于《短信转发器》保活!</string>
<string name="tips_notification_listener">请先授予《短信转发器》通知使用权否则无法转发APP通知已经自动关闭转发!</string>
<string name="notification_listener_service_enabled">通知服务已开启</string>
<string name="notification_listener_service_disabled">通知服务未开启</string>
<string name="tips_battery_optimization">Please set the power saving optimization to unlimited (no optimization), which is conducive to the survival of SMS forwarder!</string>
<string name="tips_notification_listener">Please grant the right to use SMS forwarder notification first, otherwise the APP notification cannot be forwarded and the forwarding will be automatically closed!</string>
<string name="notification_listener_service_enabled">The notification service is enabled</string>
<string name="notification_listener_service_disabled">The notification service is disabled</string>
<string name="pushplus_token">Token</string>
<string name="pushplus_topic">Topic</string>
<string name="pushplus_template">Template</string>
<string name="html">html</string>
<string name="pushplus_channel">Channel</string>
<string name="pushplus_webhook">Webhook Code</string>
<string name="pushplus_callback">Callback Url</string>
<string name="wechat">wechat</string>
</resources>

View File

@ -1,15 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="add_sender_menu">
<item>转发到钉钉机器人</item>
<item>转发到邮箱</item>
<item>转发到Bark</item>
<item>转发到Webhook</item>
<item>转发到企业微信群机器人</item>
<item>转发到企业微信应用消息</item>
<item>转发到Server酱·Turbo版</item>
<item>转发到Telegram机器人</item>
<item>转发到其他手机短信</item>
<item>转发到飞书机器人</item>
<item>钉钉机器人</item>
<item>邮箱</item>
<item>Bark</item>
<item>Webhook</item>
<item>企业微信群机器人</item>
<item>企业微信应用消息</item>
<item>Server酱·Turbo版</item>
<item>Telegram机器人</item>
<item>其他手机短信</item>
<item>飞书机器人</item>
<item>PushPlus</item>
</string-array>
</resources>

View File

@ -3,17 +3,7 @@
<color name="colorPrimary">#1C8DD4</color>
<color name="colorPrimaryDark">#1B8DD4</color>
<color name="colorAccent">#63C2FA</color>
<color name="colorBlueGreyLight">#B0BBC5</color>
<color name="colorBlueGrey">#78909C</color>
<color name="colorBlueGreyDark">#546E7A</color>
<color name="white">#ffffff</color>
<color name="black">#000000</color>
<color name="line_gray">#dcdcdc</color>
<color name="line_gray_light">#f1f1f1</color>
<color name="gray_page_bg">#ecedf1</color>
<color name="gray_text">#5b5b5b</color>
<color name="gray_text_dark">#292929</color>
<color name="gray_text_light">#979797</color>
<color name="window_half_transparent">#90000000</color>
<color name="blue_white">#0eabe5</color>
</resources>

View File

@ -99,6 +99,7 @@
<string name="settelegramtitle">设置Telegram机器人</string>
<string name="setsmstitle">设置SMS</string>
<string name="setfeishutitle">设置飞书机器人</string>
<string name="setpushplustitle">设置PushPlus</string>
<string name="test_phone_num">19999999999</string>
<string name="test_content">测试内容(content)@</string>
<string name="test_sms">【京东】验证码为387481切勿将验证码告知他人请在页面中输入完成验证如有问题请点击 ihelp.jd.com 联系京东客服</string>
@ -157,8 +158,6 @@
<string name="low_power_alarm_threshold_tips">取值范围0100留空或0禁用</string>
<string name="retry_interval">每次重试间隔(秒)</string>
<string name="retry_interval_tips">接口请求失败后将重试5次</string>
<string name="add_extra">转发时附加卡槽信息</string>
<string name="add_device_name">转发时附加设备名称</string>
<string name="forward_sms">转发短信广播</string>
<string name="forward_sms_tips">总开关,请授予读取短信、通知类短信、发送短信等权限</string>
<string name="forward_missed_calls">转发未接来电</string>
@ -168,7 +167,7 @@
<string name="enable_custom_templates">启用自定义模版</string>
<string name="enable_custom_templates_tips">优先级:转发规则的自定义模板 > 全局自定义模版 > 默认</string>
<string name="enable_exclude_from_recents">不在最近任务列表中显示</string>
<string name="enable_exclude_from_recents_tips">开启后,有效避免手动误杀进程,利于保活</string>
<string name="enable_exclude_from_recents_tips">开启后,有效避免手动误杀进程,利于保活</string>
<string name="custom_templates">转发信息模版</string>
<string name="custom_templates_tips">Tip按需插入内容标签留空使用默认模版</string>
<string name="insert_sender">来源号码</string>
@ -211,7 +210,6 @@
<string name="sender_cannot_receive">本手机是发送端,不可接收文件,请先停止服务端!</string>
<string name="no_wifi_network">未接入Wifi网络不可使用一键克隆功能!</string>
<string name="invalid_server_ip">请输入服务端IP</string>
<string name="download_failed">下载文件失败</string>
<string name="download_success">下载成功</string>
<string name="on_wireless_network">当前处于无线网络</string>
<string name="on_mobile_network">当前处于移动网络</string>
@ -228,4 +226,12 @@
<string name="tips_notification_listener">请先授予《短信转发器》通知使用权否则无法转发APP通知已经自动关闭转发!</string>
<string name="notification_listener_service_enabled">通知服务已开启</string>
<string name="notification_listener_service_disabled">通知服务未开启</string>
<string name="pushplus_token">用户令牌</string>
<string name="pushplus_topic">群组编码</string>
<string name="pushplus_template">发送模板</string>
<string name="html">html</string>
<string name="pushplus_channel">发送渠道</string>
<string name="pushplus_webhook">webhook编码</string>
<string name="pushplus_callback">回调地址</string>
<string name="wechat">wechat</string>
</resources>

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 412 KiB

After

Width:  |  Height:  |  Size: 385 KiB