概述
大家好,今晚给大家分享的是病毒查杀功能,原理是本机应用根据已备好的病毒数据库,进行扫描检查判断,若有病毒则会显示那个应用含有病毒。简单的分析三大步骤,
第一步骤:导入病毒数据库,写入在应用私有文件,第二步骤:创建病毒查询封装方法,第三步骤:病毒查杀,显示扫描信息。
步骤一:将antivirus.db导入assest目录,再拷贝到本应用的私有目录下
在oncreate方法里,创建copyDB(antivirus.db)方法。
public void copyDB(String name) {
try {
//读取assest目录下的数据库db
InputStream is = getAssets().open(name);
// 开始拷贝数据库,参数一:文件的路径,参数二:文件命名
File file = new File(getFilesDir(), name);
// 如果文件存在就返回
if (file.exists()) {
return;
}
//文件输出流写入文件
FileOutputStream fos = new FileOutputStream(file);
//将流转换为字符节数组
int len = -1;
byte[] buff = new byte[2014];
while ((len = is.read(buff)) != -1) {
fos.write(buff, 0, len);
}
//关闭流
is.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
步骤二:创建病毒数据库查询业务类,AntivirusDao
public class AntivirusDao {
//参数一:传入的md5值
public static String checkAntivirus(String md5, Context context) {
String desc = null;
//数据库保存的路径
String PATH = context.getFilesDir() + "/antivirus.db";
//打开数据库,SqliteDatabase类,参数三:数据库的打开方式
SQLiteDatabase db = SQLiteDatabase.openDatabase(PATH, null,
SQLiteDatabase.OPEN_READONLY);
//sql语句,查询病毒描述
String sql = "select desc from datable where md5 = ?";
//查询数据,游标查询
Cursor cursor = db.rawQuery(sql, new String[] { md5 });
while (cursor.moveToNext()) {
//得到查询值
desc = cursor.getString(0);
}
//返回查询值
return desc;
}
步骤三:病毒查询,显示查询信息,AntivirusActivity.java
public class AntivirusActivity extends Activity {
protected static final int BEGIN = 1;
protected static final int SCAN = 2;
protected static final int FINISH = 3;
@ViewInject(R.id.scanning_iv)
private ImageView mScanningIv;
private Context context;
private ScanInfo scanInfo;
private Message message;
private TextView mAntiTv;
private ProgressBar mPb;
private LinearLayout mLl;
private ScrollView mSv;
//实体类bean对象
static class ScanInfo {
boolean desc;
String name;
String packageName;
}
//接受消息机制
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case BEGIN://扫描之前
mAntiTv.setText("开始扫描");
break;
case SCAN://正在扫描
TextView tv=new TextView(context);
//得到传过来的数据msg.obj
ScanInfo scanInfo=(ScanInfo) msg.obj;
//有描述是,表示含有病毒
if(scanInfo.desc){
tv.setText(scanInfo.name+"有病毒");
tv.setTextSize(18);
tv.setTextColor(Color.RED);
//没描述,表示没有病毒
}else{
tv.setText(scanInfo.name+"扫描安全");
tv.setTextSize(18);
LogUtil.i("AAA", "应用名:"+scanInfo.name);
}
//将TextView控件添加到LinearLayout布局里
mLl.addView(tv);
//滚动游标向下滑
mSv.post(new Runnable() {
@Override
public void run() {
//往下滑动
mSv.fullScroll(ScrollView.FOCUS_DOWN);
}
});
break;
case FINISH://扫描之后
//动画结束
mScanningIv.clearAnimation();
mAntiTv.setText("扫描结束");
break;
default:
break;
}
};
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_antivirus);
ViewUtils.inject(this);
context = this;
mAntiTv=(TextView) findViewById(R.id.anti_tv);
mPb=(ProgressBar) findViewById(R.id.anti_pb);
mLl=(LinearLayout) findViewById(R.id.anti_body_ll);
mSv=(ScrollView) findViewById(R.id.anti_sv);
getActionBar().setDisplayHomeAsUpEnabled(true);
//创建实体类对象
scanInfo = new ScanInfo();
//旋转对象
RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotateAnimation.setDuration(5000);
//永不重复
rotateAnimation.setRepeatCount(-1);
mScanningIv.startAnimation(rotateAnimation);
initData();//初始化数据
}
// 初始化数据
private void initData() {
//耗时操作,需要开启子线程
new Thread(new Runnable() {
@Override
public void run() {
//创建信息对象,用于发消息机制
message = Message.obtain();
message.what = BEGIN;//扫描之前
handler.sendMessage(message);
创建包管理器
PackageManager packageManager = getPackageManager();
//获取所有的包安装信息
List<PackageInfo> info = packageManager.getInstalledPackages(0);
//应用程序的总数
int size = info.size();
//设置进度条总长度
mPb.setMax(size);
//设置起始进度为0
int process=0;
// 遍历
for (PackageInfo infos : info) {
//应用名
String name = infos.applicationInfo.loadLabel(
packageManager).toString();
//保存到实体类里
scanInfo.name = name;
String packageName = infos.applicationInfo.packageName;
// 保存在实体类
scanInfo.packageName = packageName;
//获取所有应用名的目录,infos.applicationInfo.sourceDir
//sourceDir:/system/app/PhaseBeam.apk
String sourceDir = infos.applicationInfo.sourceDir;
// LogUtil.i("AAA", "sourceDir:"+sourceDir);
//转换为md5值
String md5 = MD5.getMD5(sourceDir);
LogUtil.i("AAA", "md5:"+md5);
//md5:6673db57d0033a4d35979c64f43555eb
//调用封装方法,得到病毒描述
String desc = AntivirusDao.checkAntivirus(md5, context);
LogUtil.i("AAA", "desc:"+desc);
//病毒信息为空时,说明没发现病毒
if (desc == null) {
// 保存到实体类里
scanInfo.desc = false;
//病毒信息不为空,说明含有病毒
} else {
scanInfo.desc = true;
}
process++;
//设置休眠时间
SystemClock.sleep(100);
//设置进度条
mPb.setProgress(process);
message = Message.obtain();
message.what = SCAN;//正在扫描
message.obj = scanInfo;//传递数据,让消息机制接受
handler.sendMessage(message);
}
message = Message.obtain();
message.what = FINISH;//扫描之后
handler.sendMessage(message);
}
}).start();
}
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.antivirus, menu);
return true;
}
//actionBar的返回图标
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
今晚就到这里了。大家晚安。
最后
以上就是阳光飞鸟为你收集整理的病毒查杀的全部内容,希望文章能够帮你解决病毒查杀所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复