闲来无事,隧参考各种资料,做个小小的安全程序玩玩,技术知识记录如下
1、开发环境:
androidstudio
compileSdkVersion: 21
buildToolsVersion :21.1.0
minSdkVersion 14
targetSdkVersion 22
gradle:1.5.0
2、启动界面:
启动界面:加载数据,获取更新
获取软件本地版本号的方法:
PackageManager pm = getPackageManager();
//获取apk的清单文件
PackageInfo info = pm.getPackageInfo(getPackageName(),0);
info.versionName;
3、拦截短信
android4.4以上必须成为默认系统短信应用才可以拦截短信
4、收取短信:
建立一个MySmsReceiver,继承自BroadcastReceiver,然后在AndroidManifest.xml中注册该广播接收者:
<receiver android:name=".security.receiver.MySmsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
上面的priority代表进程优先级,数据越大优先级越高。
然后我们在MySmsReceiver中的onReceive()方法中可以得到短信内容
@Override
public void onReceive(Context context, Intent intent) {
Object[] objs = (Object[])intent.getExtras().get("pdus");
for(Object b : objs){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])b);
//发送者
smsSenter = smsMessage.getOriginatingAddress();
//内容
String body = smsMessage.getMessageBody();
}
}
5、获取GPS位置:
首先注册监听:
LocationManager lm = (LocationManager)context.getSystemService(context.LOCATION_SERVICE);
lm.requestLocationUpdates("gps",0,0,new MyLocationListener());
然后我们把这个MyLocationListener实现一下:
class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
String longgitude = "经度:" + location.getLongitude();
String latitude = "纬度:" + location.getLatitude();
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
6、播放音乐:最简单的方式
MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);//在res目录下新建一个raw的文件夹,把音乐文件放进去即可引用
player.setLooping(true);
player.setVolume(1.0f,1.0f);//设置最大声音
player.start();
7、卸载软件
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DELETE);
intent.setData(Uri.parse("package:"+getPackageName()));
startActivity(intent);
8、获取手机联系人:
这里利用ContentResolver:
private ArrayList<Map<String,String>> getContactsData(){
ArrayList<Map<String,String>> contactsData = new ArrayList<Map<String,String>>();
ContentResolver contentResolver = getContentResolver();
String[] str = {Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER,
Phone.PHOTO_ID};
Cursor cur = contentResolver.query(Phone.CONTENT_URI, str, null, null, null);
while (cur.moveToNext()){
Map<String,String> data = new HashMap<String,String>();
data.put("name",cur.getString(cur.getColumnIndex(Phone.DISPLAY_NAME)));
data.put("number",cur.getString(cur.getColumnIndex(Phone.NUMBER)));
contactsData.add(data);
}
cur.close();
return contactsData;
}
/**
Phone.CONTENT_URI = content://com.android.contacts/data/phones
这就是一个ContentProvider的地址;
Phone.CONTACT_ID = contact_id
Phone.DISPLAY_NAME = display_name
Phone.NUMBER = data
Phone.PHOTO_ID = photo_id*/
号码归属地查询
利用网络查询或者使用本地数据库查询
本地数据库可以上淘宝搜“手机号码数据库”,随便买一个就行。
9、来电监听:
首先申请权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
然后监听:
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
tm.Listen(new OnePhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
接着我们实现OnePhoneStateListener这个监听者:
class OnePhoneStateListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
Log.i(TAG, "[Listener]电话号码:"+incomingNumber);
switch(state){
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG, "[Listener]等待接电话:"+incomingNumber);
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG, "[Listener]电话挂断:"+incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG, "[Listener]通话中:"+incomingNumber);
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
//当你在服务里面做来电监听时候,记得在服务被销毁时候要取消监听,否则即使你把服务杀死了,还是可以监听到来电。
public void onDestory(){
tm.Listen(myCallListener,PhoneStateListener.LISTEN_NONE);//这句话可以注销监听
}
注意:android6.0、7.0要动态申请权限
10、去电监听:
权限:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
这里采用java动态注册广播接收者来监听去电
class MyCallOutReceiver extends BroadcastReceiver{
public void onReceiver(Context context,Intent intent){
String callPhoneNumber = getResultData();
Toast.makeText().show();
}
}
MyCallOutReceiver myCallOutReceiver = new MyCallOutReceiver();
IntentFilter filter = new IntentFilter("android.intent.action.NEW_OUTGOING_CALL");//设置动作响应
registerReceiver(myCallOutReceiver,filter);//注册广播接收者当然,最后是要取消广播接收者的。
unregisterReceiver(myCallOutReceiver);
//把广播接收者写在服务里面,就可以获得和服务一样的生命周期!!
==可以采用自定义土司来长时间显示一个Toast。
Toast实际上是通过WindowsManager对象添加进入而显示的。windowsManager.addView();
然后通过windowsManager.removeView();移除掉的。
中间可能通过一些队列或者任务来设定一定时间后消失Toast的==。
11、删除通话记录
在联系人的数据库里面有个叫calls的表,里面存放了通话记录的内容。
删除通话记录就是删除这个表里面的数据,可以利用内容提供者来进行操作。
12、获取手机所有app信息
public static List<AppInfo> getAppInfo(Context context){
List<AppInfo> myAppInfos = new ArrayList<AppInfo>();
PackageManager pm = context.getPackageManager();
List<PackageInfo> appInfos = pm.getInstalledPackages(0);
for(PackageInfo info : appInfos){
AppInfo appInfo = new AppInfo();
appInfo.pkgName = info.packageName;
appInfo.name = info.applicationInfo.loadLabel(pm).toString();
appInfo.icon = info.applicationInfo.loadIcon(pm);
//判断一个程序是用户程序还是系统程序,安装在手机内存还是外存储设备中
int flags = info.applicationInfo.flags;
if((flags & ApplicationInfo.FLAG_SYSTEM) == 0){
//用户程序
appInfo.userApp = true;
}else{
//系统程序
appInfo.userApp = false;
}
if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0){
//手机内存中
appInfo.inRom = true;
}else{
//外存储设备中
appInfo.inRom = false;
}
myAppInfos.add(appInfo);
}
return myAppInfos;
}
13、获取手机内存信息
获取正在运行的进程:
public static int getRunningAppCount(Context context){
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfoList = activityManager.getRunningAppProcesses();
return runningAppProcessInfoList.size();
}
获取当前正在运行的Service
List<ActivityManager.RunningServiceInfo> appList2 = mActivityManager.getRunningServices(100);
for (ActivityManager.RunningServiceInfo running : appList2) {
System.out.println(running.service.getClassName());
}
获取正已运行的内存:
public static long getAvailMemSize(Context context){
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
return memoryInfo.availMem;
}
获取总的内存:
public static long getTotalMemSize(Context context){
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
return memoryInfo.totalMem;
}
获取最近运行的应用
List<ActivityManager.RecentTaskInfo> appList4 = mActivityManager.getRecentTasks(100, 1);
for (ActivityManager.RecentTaskInfo running : appList4) {
System.out.println(running.origActivity.getClassName());
}
14、手机杀毒原理
一般手机杀毒就是通过提取文件的MD5校验码来检验,或者提取sha1校验码来验证。一个文件一旦被改动,则它的校验码就会改变;
杀毒软件提取文件的MD5校验码后就去病毒库里面查找该文件的MD5码,如果存在,则该文件就是一个病毒;