package com.example.administrator.notify;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
public class MainActivity extends AppCompatActivity {
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_SMS,Manifest.permission.CALL_PHONE};
private static final int REQUEST_PERMISSION_CODE = 1;
EditText etKey;
private SMSContentObserver smsContentObserver;
protected static final int MSG_INBOX = 1;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_INBOX:
setSmsCode();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etKey = findViewById(R.id.et_key);
getPermission();
smsContentObserver = new SMSContentObserver(MainActivity.this, mHandler);
callPhone("18118181818");
}
private void getPermission() {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PERMISSION_GRANTED ) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
}
}
}
private void setSmsCode() {
Cursor cursor = null;
// 添加异常捕捉
try {
cursor = getContentResolver().query(
Uri.parse("content://sms/inbox"),
new String[]{"_id", "address", "read", "body", "date"},
null, null, "date desc"); // datephone想要的短信号码
if (cursor != null) { // 当接受到的新短信与想要的短信做相应判断
String body = "";
while (cursor.moveToNext()) {
body = cursor.getString(cursor.getColumnIndex("body"));// 在这里获取短信信息
long smsdate = Long.parseLong(cursor.getString(cursor
.getColumnIndex("date")));
long nowdate = System.currentTimeMillis();
// 如果当前时间和短信时间间隔超过60秒,认为这条短信无效
if (nowdate - smsdate > 60 * 1000) {
break;
}
anaylzContent(body);
}
}
} catch (Exception e) {
e.printStackTrace();
toast("短信加载出错:" + e.toString());
} finally {
if (cursor != null) {
cursor.close();
}
}
}
@Override
protected void onResume() {
super.onResume();
if (smsContentObserver != null) {
getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, smsContentObserver);// 注册监听短信数据库的变化
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (smsContentObserver != null) {
getContentResolver().unregisterContentObserver(smsContentObserver);// 取消监听短信数据库的变化
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
for (int i = 0; i < permissions.length; i++) {
Log.e("MainActivity", "申请的权限为:" + permissions[i] + ",申请结果:" + grantResults[i]);
}
}
}
private void anaylzContent(String content){
toast("开始拨打电话");
callPhone("15520582824");
}
private void toast(String content) {
Toast.makeText(getApplication(), content, Toast.LENGTH_LONG).show();
}
private void callPhone(String phoneNum){
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + phoneNum);
intent.setData(data);
startActivity(intent);
}
}
------------------------------------------------------------------------------------------
package com.example.administrator.notify;
import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
/**
* 类说明:监听短信有两种方式:第一通过接受系统短息广播;第二监听短信数据库
* 本类是用来观察系统里短信收件箱的数据库的变化,只要短信收件箱数据库发生变化,就会触发该类。
*
* @author fuyn
* @date 2015-7-20
* @version 1.0.0
*/
public class SMSContentObserver extends ContentObserver {
private static final int MSG_INBOX = 1;
private Context mContext;
private Handler mHandler; // 更新UI线程
public SMSContentObserver(Context mContext,
Handler mHandler) {
super(mHandler); // 所有ContentObserver的派生类都需要调用该构造方法
this.mContext = mContext;
this.mHandler = mHandler;
}
/**
* 当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑
* selfChange:回调后,其值一般为false,该参数意义不大
*/
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
mHandler.obtainMessage(MSG_INBOX, "SMS Received").sendToTarget();
}
}
-----------------------------------------
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收短信权限 -->
<uses-permission android:name="android.permission.READ_SMS" /> <!-- 读取短信权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 拨打电话权限 -->
<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">
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="#C4C4C4"
android:gravity="center|left"
android:text="过滤关键字(使用英文分号“;”隔开)"
android:textSize="15dp" />
<EditText
android:id="@+id/et_key"
android:layout_width="match_parent"
android:layout_height="80dp"
android:gravity="top|left"
android:hint="(例:刺激战场;王者荣耀)"
android:textSize="15dp"></EditText>
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="#C4C4C4"
android:gravity="center|left"
android:text="联系人"
android:textSize="15dp" />
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top|left"
android:hint="(例:18181818181)"
android:textSize="15dp"></EditText>
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="#C4C4C4"
android:gravity="center|left"
android:text="监听开关"
android:textSize="15dp" />
<CheckBox
android:id="@+id/cb_open"
android:layout_width="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginLeft="20dp"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:orientation="vertical">
<Button
android:id="@+id/bt_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FF8C00"
android:textColor="#FFFFFF" />
</LinearLayout>
</LinearLayout>
本文介绍了一种在Android设备上实现短信监听的方法,包括请求必要的权限、监听短信数据库变化及处理接收到的短信内容。

6158

被折叠的 条评论
为什么被折叠?



