黑名单电话管理

服务类


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


import com.android.internal.telephony.ITelephony;
import com.karen.db.DBUtil;
import com.karen.entity.Phone;
import com.karen.entity.SMS;
import com.karen.manager.SMSManager;


import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;


public class MyService extends Service{
public static final String SMS_RECEIVE=
"android.provider.Telephony.SMS_RECEIVED";
public static final String OUTGOING_CALL=
"android.intent.action.NEW_OUTGOING_CALL";
DBUtil dbUtil=null;
MyReceiver receiver=null;
//电话服务管理器
TelephonyManager manager=null;

ITelephony ibinder=null;

@Override
public void onCreate() {
Log.i("TAG", "服务启动了");

manager=(TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
//通过反射方法拿该服务中的ITelephony对象
try {
Method method=manager.getClass().getDeclaredMethod("getITelephony", null);
//设置该私有方法是可以被调用的
method.setAccessible(true);
ibinder=(ITelephony) method.invoke(manager, null);

} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
dbUtil=new DBUtil(this);
//注册广播接收器
registMyReceiver();
//广播接收器能够接收到短信到来时的系统广播

//挂断黑名单电话
//监听电话的状态

listenPhoneState();

super.onCreate();
}

private void listenPhoneState() {
PhoneStateListener listener=new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
//监听电话的状态
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://空闲状态
break;
case TelephonyManager.CALL_STATE_OFFHOOK://通话状态不干预
break;
case TelephonyManager.CALL_STATE_RINGING://响铃
//来电是否是黑名单电话
if(dbUtil.isBlackNumber(incomingNumber)){
try {
Log.i("TAG", "黑名单电话来电话了");
//挂断
ibinder.endCall();
//将系统通话记录表中生成的数据清空
new Handler().postDelayed(new Runnable() {

@Override
public void run() {
dbUtil.deleteCalllog(MyService.this, incomingNumber);
}
}, 5000);
} catch (RemoteException e) {
e.printStackTrace();
}
}
default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}

};

manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

}


private void registMyReceiver() {
receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(SMS_RECEIVE);
//过滤拨出电话的广播
filter.addAction(OUTGOING_CALL);
filter.setPriority(1000);
registerReceiver(receiver, filter);
}


public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if(SMS_RECEIVE.equals(action)){
Log.i("TAG", "有短信发来");
//拿到短信的电话号码
Bundle bundle=intent.getExtras();
String number=SMSManager.getNumberFromSMS(bundle);
//判断电话是否是黑名单电话
if(dbUtil.isBlackNumber(number)){
Log.i("TAG", "黑名单短信");
//阻止短信继续向下传递
abortBroadcast();
//把发来的短信的内容存入短信黑名单列表
SMS sms=new SMS();
sms.setNumber(number);
sms.setBody(SMSManager.getBodyFromSMS(bundle));
sms.setDate(System.currentTimeMillis());

dbUtil.insertSMS(sms);
}
}
if(OUTGOING_CALL.equals(action)){
Log.i("TAG", "打出电话");
//获得打出的电话号码
String number=getResultData();
//判断是否是黑名单电话
if(dbUtil.isBlackNumber(number)){
Log.i("TAG", "打出的电话是黑名单电话");
//电话不再拨出
setResultData(null);
//把打电话的信息写入到拨出记录中
Phone phone=new Phone();
phone.setNumber(number);
phone.setDate(System.currentTimeMillis());
//拨出去的电话
phone.setType(2);
dbUtil.insertPhone(phone);
}
}
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onDestroy() {
Log.i("TAG", "停止监听");
manager.listen(null, PhoneStateListener.LISTEN_CALL_STATE);
manager=null;
//注销广播接收器
unregisterReceiver(receiver);
super.onDestroy();
}
}


uitl 工具类

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.provider.CallLog;


import com.karen.entity.Phone;
import com.karen.entity.SMS;


/**
 * 数据库的管理类
 * 完成对数据库表的增删改查的操作
 * @author pjy
 *
 */
public class DBUtil {
MyDBHelper helper=null;

public DBUtil(Context context){
helper=MyDBHelper.getInstance(context);
}
//黑名单的电话的添加
public void insertBlackNumber(String number){
SQLiteDatabase database= helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("number", number);
database.insert("blacktable", null, values);

}
//判断是否是一个黑名单电话
public boolean isBlackNumber(String number){
SQLiteDatabase database=helper.getReadableDatabase();
String selection="number=?";
String args[]=new String[]{number};
Cursor cursor=database.query("blacktable", null, selection, args, null, null, null);

if(cursor.moveToNext()){
return true;
}
cursor.close();
return false;
}
/**
* 添加一条黑名单短信
*/
public void insertSMS(SMS sms){
SQLiteDatabase database=helper.getWritableDatabase();

ContentValues values=new ContentValues();
values.put("number", sms.getNumber());
values.put("body", sms.getBody());
values.put("date", sms.getDate());

database.insert("smstable", null, values);
}
/**
* 插入一条拨出的黑名单电话
*/
public void insertPhone(Phone phone){
SQLiteDatabase database=helper.getWritableDatabase();

ContentValues values=new ContentValues();

values.put("number", phone.getNumber());
values.put("type", phone.getType());
values.put("date", phone.getDate());

database.insert("phonetable", null, values);
}
//删除黑名单打来的通话记录
public void deleteCalllog(Context context,String number){
ContentResolver resolver=context.getContentResolver();
Uri uri=CallLog.Calls.CONTENT_URI;
String where="number=?";
String[] args=new String[]{number};
resolver.delete(uri, where, args);
}

}

创建的数据库


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


public class MyDBHelper extends SQLiteOpenHelper {


//实现数据库的创建 phone.db
//表的创建
//1.blacktable 黑名单电话表
//2.smstable   短信记录表
//3.phonetable 拨出电话表
private static MyDBHelper helper=null;
private MyDBHelper(Context context) {
super(context, "phone.db", null, 1);
}

public static synchronized MyDBHelper getInstance(Context context){
if(helper==null){
helper=new MyDBHelper(context);
}
return helper;
}

@Override
public void onCreate(SQLiteDatabase db) {
//创建表的操作
String sql1="create table blacktable(id integer primary key autoincrement,number text not null)";//实现第一张表的创建
String sql2="create table " +
"smstable(id integer primary key autoincrement," +
"number text not null," +
"body text not null," +
"date integer not null)";
String sql3="create table " +
"phonetable(id integer primary key autoincrement," +
"number text not null," +
"type integer not null," +
"date integer not null)";
db.execSQL(sql1);
db.execSQL(sql2);
db.execSQL(sql3);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}

}


短信管理类

import android.os.Bundle;
import android.telephony.SmsMessage;


public class SMSManager {
public static String getNumberFromSMS(Bundle bundle) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messagees = new SmsMessage[pdus.length];


messagees[0] = SmsMessage.createFromPdu((byte[]) pdus[0]);


String number = messagees[0].getOriginatingAddress();
return number;
}
public static String getBodyFromSMS(Bundle bundle){
Object[] pdus=(Object[])bundle.get("pdus");
SmsMessage[] messages=new SmsMessage[pdus.length];
StringBuilder builder=new StringBuilder();
for(int i=0;i<pdus.length;i++){
  byte[] pdu=(byte[])pdus[i];
  messages[i]= SmsMessage.createFromPdu(pdu);
  builder.append(messages[i].getDisplayMessageBody()) ;
}
return builder.toString();
}
}

剩下的实体类和main类应该很简单了,另外需要在清单配置文件中注册几个权限:


<uses-permission android:name="android.permission.RECEIVE_SMS" />

<uses-permission android:name="android.permission.READ_SMS"/>

<uses-permission android:name="android.permission.WRITE_SMS"/>


<uses-permission android:name="android.permission.CALL_PHONE"/>


    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>


    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>


    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>


    <uses-permission android:name="android.permission.READ_CONTACTS"/>


    <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
 
















 



数据集介绍:野生动物与家畜多目标检测数据集 数据集名称:野生动物与家畜多目标检测数据集 数据规模: - 训练集:1,540张图片 - 验证集:377张图片 - 测试集:316张图片 分类类别: Brown-bear(棕熊)、Chicken(鸡)、Fox(狐狸)、Hedgehog(刺猬)、Horse(马)、Mouse(老鼠)、Sheep(绵羊)、Snake(蛇)、Turtle(龟)、Rabbit(兔)及通用object(物体)共11个类别 标注格式: YOLO格式标注,包含归一化坐标与类别索引,支持目标检测模型训练 数据特性: 涵盖航拍与地面视角,包含动物个体及群体场景,适用于复杂环境下的多目标识别 农业智能化管理: 通过检测家畜(鸡/马/绵羊等)数量及活动状态,辅助畜牧场自动化管理 生态监测系统: 支持野生动物(棕熊/狐狸/刺猬等)识别与追踪,用于自然保护区生物多样性研究 智能安防应用: 检测农场周边危险动物(蛇/狐狸),构建入侵预警系统 动物行为研究: 提供多物种共存场景数据,支持动物群体交互行为分析 高实用性标注体系: - 精细标注包含动物完整轮廓的边界框 - 特别区分野生动物与家畜类别,支持跨场景迁移学习 多维度覆盖: - 包含昼间/复杂背景/遮挡场景 - 涵盖陆地常见中小型动物与禽类 - 提供通用object类别适配扩展需求 工程适配性强: - 原生YOLO格式适配主流检测框架(YOLOv5/v7/v8等) - 验证集与测试集比例科学,支持可靠模型评估 生态价值突出: - 同步覆盖濒危物种(龟类)与常见物种 - 支持生物多样性保护与农业生产的双重应用场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值