基于android原生短信app实现定时发短信功能

本文介绍了一种在Android 8.1 MtkMms中实现定时发送短信的方法,通过利用已有的queue类型短信并添加定时字段。在发送时,先将短信标记为queue类型并设置定时,然后利用AlarmManager触发发送。具体实现涉及SmsMessageSender.java和SmsReceiverService.java的修改,并提供了一系列的代码补丁。
摘要由CSDN通过智能技术生成

基于android 8.1 MtkMms,vendor/mediatek/proprietary/packages/apps/Mms/进行实现的
一个思路是参考草稿箱的数据库结构,新建一个类似草稿箱的类型timer,定时发送时先把短信内容标记成timer类型存入数据库,
到设定的时间后再从数据库中取出timer类型的短信内容发送出去,这种方式需要修改数据库新增一个timer类型,而且在发送的短信列表要读取timer类型的短信进行显示.

其实有更方便的方式实现,通过观察短信数据库/data/user_de/0/com.android.providers.telephony/databases/mmssms.db中sms表的type类型,可以发现除了有inbox/outbox/draft的短信类型,还有一种queue的类型,通过阅读短信的代码,发现短信发送时会先将短信标记成queue类型存入数据库,然后从数据库中读取一条
queue类型的短信标记成outbox类型发送出去,然后再从数据库中读取下一条queue类型的短信进行发送,直到数据库中没有queue类型的短信。

这样我们就可以在短信标记成queue类型存入数据库时加入一个定时字段,然后在读取queue类型的短信时判断定时字段的时间,通过AlarmManager设置定时。定时字段我们也不用修改数据库,可以直接使用sms表的date_sent字段,这个字段用来存储收到短信的时间,对于发送短信没有用都是0.

发送短信插入定时的逻辑在SmsMessageSender.java, 读取queue类型短信进行发送的逻辑在SmsReceiverService.java,通过处理SmsReceiverService.ACTION_SEND_MESSAGE广播来完成
patch如下

diff --git a/mediatek/proprietary/packages/apps/Mms/AndroidManifest.xml b/mediatek/proprietary/packages/apps/Mms/AndroidManifest.xml
index a2a0382..25a46f0 100755
--- a/mediatek/proprietary/packages/apps/Mms/AndroidManifest.xml
+++ b/mediatek/proprietary/packages/apps/Mms/AndroidManifest.xml
@@ -772,6 +772,13 @@
             android:launchMode="singleTask"
             android:theme="@style/MmsTheme"
             android:excludeFromRecents="true"/>
+        <!-- fangao cyj add for timer mms start -->
+        <activity android:name="com.android.mms.ui.DateTimePickerActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:label="@string/timer_select_time"
+            android:launchMode="singleTask"
+            android:excludeFromRecents="true"/>
+        <!-- fangao cyj add for timer mms end -->
         <provider
             android:name="android.support.v4.content.FileProvider"
             android:authorities="@string/contacts_file_provider_authority"
diff --git a/mediatek/proprietary/packages/apps/Mms/res/drawable-xxxhdpi/ic_timer_date.png b/mediatek/proprietary/packages/apps/Mms/res/drawable-xxxhdpi/ic_timer_date.png
new file mode 100644
index 0000000..95f26cc
Binary files /dev/null and b/mediatek/proprietary/packages/apps/Mms/res/drawable-xxxhdpi/ic_timer_date.png differ
diff --git a/mediatek/proprietary/packages/apps/Mms/res/drawable/date_time_picker_bg.xml b/mediatek/proprietary/packages/apps/Mms/res/drawable/date_time_picker_bg.xml
new file mode 100755
index 0000000..9a89e21
--- /dev/null
+++ b/mediatek/proprietary/packages/apps/Mms/res/drawable/date_time_picker_bg.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:state_pressed="true"
+        android:drawable="@color/timer_button_pressed_bg"
+        />
+    <item
+        android:drawable="@color/timer_button_bg"
+        />
+
+</selector>
diff --git a/mediatek/proprietary/packages/apps/Mms/res/layout-finger-1080X720/compose_message_activity.xml b/mediatek/proprietary/packages/apps/Mms/res/layout-finger-1080X720/compose_message_activity.xml
index c38ce83..ee0f4fc 100755
--- a/mediatek/proprietary/packages/apps/Mms/res/layout-finger-1080X720/compose_message_activity.xml
+++ b/mediatek/proprietary/packages/apps/Mms/res/layout-finger-1080X720/compose_message_activity.xml
@@ -177,7 +177,28 @@
                         android:layout_height="wrap_content"/>
                 </view>
             </ScrollView>
-
+                    <!-- fangao cyj add start -->
+            <LinearLayout
+                android:id="@+id/date_send_layout"
+                android:orientation="horizontal"
+                android:visibility="gone"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content">
+               <TextView
+                    android:id="@+id/date_send_text"
+                    android:paddingLeft="4dip"
+                    android:paddingTop="6dip"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:textColor="#ff000000"
+                    />
+                <ImageView
+                    android:id="@+id/date_send_delete"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:src="@drawable/ic_delete_file_attachment"/>
+            </LinearLayout>
+                    <!-- fangao cyj add end -->
             <LinearLayout
                 android:id="@+id/bottom_panel"
                 android:orientation="horizontal"
diff --git a/mediatek/proprietary/packages/apps/Mms/res/layout/date_time_picker.xml b/mediatek/proprietary/packages/apps/Mms/res/layout/date_time_picker.xml
new file mode 100644
index 0000000..ab3f652
--- /dev/null
+++ b/mediatek/proprietary/packages/apps/Mms/res/layout/date_time_picker.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 Esmertec AG.
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<RelativeLayout 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">
+    
+    <Button
+        android:id="@+id/dateButton"
+        android:layout_width="match_parent"
+        android:layout_height="40dip"
+        android:layout_marginTop="20dip"
+        android:text="year-month-day"
+        android:textSize="18dip"
+        android:background="@drawable/date_time_picker_bg"
+        android:onClick="pickSendDate"
+        />
+    
+    <Button
+        android:id="@+id/timeButton"
+        android:layout_below="@id/dateButton"
+        android:layout_width="match_parent"
+        android:layout_height="40dip"
+        android:layout_marginTop="1dip"
+        android:text="hour:minute"
+        android:textSize="18dip"
+        android:background="@drawable/date_time_picker_bg"
+        android:onClick="pickSendTime"
+        />
+    
+    <DatePicker
+        android:id="@+id/datePicker"
+        android:layout_below="@id/timeButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="20dp"
+        android:textColor="#ff000000"
+        android:startYear="2019"
+        android:endYear="2030"
+        android:datePickerMode="spinner"
+        android:visibility="gone"
+        />
+        
+    <TimePicker
+        android:id="@+id/timePicker"
+        android:layout_below="@id/timeButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:textColor="#ff000000"
+        android:layout_marginTop="20dp"
+        android:timePickerMode="spinner"
+        android:visibility="gone"
+        />
+    <LinearLayout
+        android:layout_marginTop="220dip"
+        android:layout_below="@id/datePicker"
+        android:orientation="horizontal"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content">
+    <Button
+        android:id="@+id/cancelButton"
+        android:layout_weight="1"
+        android:layout_width="fill_parent"
+   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值