<pre class="java" name="code">package cn.itcast.mobilesafe.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Encoder {
//md5 加密 javase
public static String encode(String pwd) {
try {
//得到消息算法.加密器
MessageDigest digest = MessageDigest.getInstance("MD5");
//得到byte数组. 将byte[]里面的数据以16进值得方式显示出来.
byte[] bytes = digest.digest(pwd.getBytes());
StringBuffer sb = new StringBuffer();
for(int i = 0;i<bytes.length;i++){
//将byte[]里面的数据以16进值得方式显示出来,用string
// 0xff 11111111 &与操作
String s = Integer.toHexString(0xff&bytes[i]);
if(s.length()==1){
sb.append("0"+s);
}else{
sb.append(s);
}
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException("buhuifasheng");
}
}
}
<pre class="java" name="code"><pre class="java" name="code"><pre class="java" name="code"><pre class="java" name="code"><pre class="java" name="code">package cn.itcast.mobilesafe.receiver;import cn.itcast.mobilesafe.R;import cn.itcast.mobilesafe.db.dao.BlackNumberDao;import cn.itcast.mobilesafe.engine.GPSInfoProvider;import android.app.admin.DevicePolicyManager;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.media.MediaPlayer;import android.telephony.SmsManager;import android.telephony.SmsMessage;import android.util.Log;//创建一个短信的receiver //如果我向目标手机发送一条 #*location*#信息,目标手机就把他的地址给我发过来.public class SMSReceiver extends BroadcastReceiver {private static final String TAG = "SMSReceiver";private BlackNumberDao dao;@Overridepublic void onReceive(Context context, Intent intent) {dao = new BlackNumberDao(context);// 获取短信的内容// #*location*#123456Object[] pdus = (Object[]) intent.getExtras().get("pdus");//遍历pdus[]数组,获取每一条短信的信息.for (Object pdu : pdus) {//pdu转化为SmsMessage.SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);//由SmsMessage得到content.String content = sms.getMessageBody();Log.i(TAG, "短信内容" + content);//由SmsMessage得到sender.发送者的号码.String sender = sms.getOriginatingAddress();//若果短信内容为"#*location*#就先终止广播并且if ("#*location*#".equals(content)) {// 终止广播abortBroadcast();//得到GPSInfoProvider.GPSInfoProvider provider = GPSInfoProvider.getInstance(context);//GPSInfoProvider得到location.String location = provider.getLocation();//得到短信管理者.用来向目标手机发送经纬度.SmsManager smsmanager = SmsManager.getDefault();// String destination=sp.getString("safenumber","");if ("".equals(location)) {} else {smsmanager.sendTextMessage(sender, null, location, null,null);}}else if("#*locknow*#".equals(content)){//得到DevicePolicyManagerDevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);manager.resetPassword("123", 0);manager.lockNow();abortBroadcast();}else if("#*wipedata*#".equals(content)){DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);manager.wipeData(0);abortBroadcast();}else if("#*alarm*#".equals(content)){//得到MediaPlayer,prepared已经做了.MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);player.setVolume(1.0f, 1.0f);player.start();abortBroadcast();}if(dao.find(sender)){// 黑名单的短信abortBroadcast();//todo: 把短信内容存放到自己的数据库里面}//建立短信内容的匹配库 (关键字: 发票,卖房,哥,学生....办证...)if(content.contains("fapiao")){Log.i(TAG,"垃圾短信 发票");abortBroadcast();}}}}
package cn.itcast.mobilesafe.receiver;
import cn.itcast.mobilesafe.ui.LostProtectedActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;
public class CallPhoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//在清单文件中声明.
//<intent-filter android:priority="1000" >
// <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
//</intent-filter>
//只要应用程序装到手机上,广播事件就注册了.只要接收到的信息是20122012就自动开启.
//主activiity.
String number = getResultData();
if("20122012".equals(number)){
Intent lostintent = new Intent(context,LostProtectedActivity.class);
//设置flag. //指定要激活的activity在自己的任务栈里面运行
lostintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(lostintent);
// 终止掉这个电话 ,外拨电话的广播,他显示地指明了广播的接受者.必须修改数据位空.
// 不能通过 abortBroadcast();
setResultData(null);
}
}
}
package cn.itcast.mobilesafe.ui;import cn.itcast.mobilesafe.R;import android.app.Activity;import android.content.Context;
package cn.itcast.mobilesafe.ui;
import java.util.List;
import cn.itcast.mobilesafe.R;
import cn.itcast.mobilesafe.domain.ContactInfo;
import cn.itcast.mobilesafe.engine.ContactInfoService;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
//选择联系人的activiity.布局是listview .选择后,然后选择调回到向导.
//通过cp
public class SelectContactActivity extends Activity {
private ListView lv;
//集合 infos. 里面放置的是ContactInfo对象.
private List<ContactInfo> infos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.select_contact);
//new ContactInfoService联系人信息的干活服务.取数据服务.
ContactInfoService service = new ContactInfoService(this);
//首先得先得到客户信息.infos,再给lv设置数据适配器.顺序不能错.
infos = service.getContactInfos();
//实例化lv.
lv = (ListView) this.findViewById(R.id.lv_select_contact);
//设置适配器
lv.setAdapter(new SelectContactAdapter());
//item点击事件
lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//infos中得到电话. infos.get(position)得到某个元素.info.
String phone = infos.get(position).getPhone();
Intent intent = new Intent();
intent.putExtra("number", phone);
//将电话返回去.
setResult(0, intent);
finish();
}});
}
private class SelectContactAdapter extends BaseAdapter{
public int getCount() {
return infos.size();
}
public Object getItem(int position) {
return infos.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
//一种是布局文件中得到.另外一种是 代码中实现布局.VERTICAL垂直布局.这是小的布局.
ContactInfo info = infos.get(position);
//得到LinearLayout布局
LinearLayout ll = new LinearLayout(SelectContactActivity.this);
//就是一行一行的.
ll.setOrientation(LinearLayout.VERTICAL);
//得到tv1.
TextView tv_name = new TextView(SelectContactActivity.this);
tv_name.setText("姓名"+ info.getName());
//得到tv2.
TextView tv_phone = new TextView(SelectContactActivity.this);
tv_phone.setText("联系电话"+ info.getPhone());
//将控件加入linearlayout.
ll.addView(tv_name);
ll.addView(tv_phone);
return ll;
}
}
}
<pre class="java" name="code">package cn.itcast.mobilesafe.engine;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import cn.itcast.mobilesafe.domain.ContactInfo;
//自己定义的engine包里取数据的信息,
//只有在自定义的供其他调用的应用里才会extents contentProverder.
public class ContactInfoService {
private Context context;
public ContactInfoService(Context context) {
this.context = context;
}
public List<ContactInfo> getContactInfos(){
//得到contentResolver.
ContentResolver resolver = context.getContentResolver();
//1.rawuri. 获取联系人的id
//2.rawuri. 根据联系人的id 获取联系人名字 获取名字.
//3.datauri.根据联系人的id 数据的type 获取到对应的数据(电话,email); 获取数据.
//
List<ContactInfo> infos = new ArrayList<ContactInfo>();
ContactInfo info ;
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
//得到原url.
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
info = new ContactInfo();
//根据_id得到id.
String id = cursor.getString(cursor.getColumnIndex("_id"));
//根据display_name得到名字name.
String name = cursor.getString(cursor.getColumnIndex("display_name"));
//添加进info.
info.setName(name);
//把id传进去得到datacursor.
Cursor datacursor = resolver.query(datauri, null, "raw_contact_id=?", new String[]{id}, null);
while (datacursor.moveToNext()) {
//mimetype
String type = datacursor.getString(datacursor.getColumnIndex("mimetype"));
if("vnd.android.cursor.item/phone_v2".equals(type)){
//得到电话号码.
String number = datacursor.getString(datacursor.getColumnIndex("data1"));
//添加进info.
info.setPhone(number);
}
}
//游标关闭.
datacursor.close();
//添加进集合里面
infos.add(info);
//之后将info设置为null.
info = null;
}
//游标关闭.
cursor.close();
return infos;
}
}
package cn.itcast.mobilesafe.engine;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.text.TextUtils;
/**
* 保证这个类只存在一个实例 保证GPSInfoProvider只存在一个实例.
* @author zehua
*
*/
//开发出方法,供别人调用.
public class GPSInfoProvider {
LocationManager manager;
//实例对象.
private static GPSInfoProvider mGPSInfoProvider;
private static Context context;
private static MyLoactionListener listener;
//1.私有化构造方法
//放置多次调用
// 1私有化构造方法.
private GPSInfoProvider(){};
//2. 提供一个静态的方法 可以返回他的一个实例
// 提供一个静态的方法可以返回他的实例.
//静态的. GPSInfoProvider类型.synchronized保证所有都得完成,不被打断.
public static synchronized GPSInfoProvider getInstance(Context context){
if(mGPSInfoProvider==null){
//为空的话,new出来.
mGPSInfoProvider = new GPSInfoProvider();
GPSInfoProvider.context = context;
}
//不为空就直接返回
return mGPSInfoProvider;
}
// 获取gps 信息 得到最近的一次的lacation.从sp里面得到.
public String getLocation(){
//LocationManager位置管理者.
manager =(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//manager.getAllProviders(); // gps //wifi //
//用什么设备来获取信息.
//开发一个方法来获取最好的位置提供者.
String provider = getProvider(manager);
// 给LocationManager注册位置的监听器
// 60000每个多长时间更新位置信息.一分钟. 每走50米重新获取位置信息.
// getListener()位置发生改变所发生的回调函数.
//getListener()返回值是MyLoactionListener的实例location.
manager.requestLocationUpdates(provider,60000, 50, getListener());
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String location = sp.getString("location", "");
return location;
}
// 停止gps监听
public void stopGPSListener(){
//getListener() 保证只有一个实例.
manager.removeUpdates(getListener());
}
//同步方法,获取唯一实例.返回值为MyLoactionListener.
private synchronized MyLoactionListener getListener(){
if(listener==null){
//实例为listener.对象.
listener = new MyLoactionListener();
}
return listener;
}
//手机位置改变的时候调用方法. 这是一个类.只能拥有一个MyLoactionListener的实例.
//LocationListener为接口.
private class MyLoactionListener implements LocationListener{
/**
* 当手机位置发生改变的时候 调用的方法
*/
public void onLocationChanged(Location location) {
//得到维度
String latitude ="latitude "+ location.getLatitude(); //weidu
String longtitude = "longtitude "+ location.getLongitude(); //jingdu
//实例sp
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
Editor editor = sp.edit();
//将精度保存到sp中.
editor.putString("location", latitude+" - "+ longtitude);
editor.commit();
//将最后一次获取到的位置信息 存放到sharedpreference里面
}
/**
* 某一个设备的状态发生改变的时候 调用 可用->不可用 不可用->可用 .
* gps打开,但是手机不允许获取位置.
* 手机允许用还是不可用.
*/
public void onStatusChanged(String provider, int status, Bundle extras) {
}
/**
* 某个设备被打开 当gps被打开.
*/
public void onProviderEnabled(String provider) {
}
/**某个设备被禁用
*
*/
public void onProviderDisabled(String provider) {
}
}
/**\
*
* @param manager 位置管理服务
* @return 最好的位置提供者
*/
//
private String getProvider(LocationManager manager){
//criteria.类
Criteria criteria = new Criteria();
//精度.fine表示精准. coarse大体的位置.
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//对海拔不敏感
criteria.setAltitudeRequired(false);
//耗电性能.省电. 精度越高越耗电.
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
//速度变化敏感
criteria.setSpeedRequired(true);
//产生通讯的费用.
criteria.setCostAllowed(true);
//criteria一组条件.关心精度,维度,加速度,海拔,是否产生开销.
//参数二就是 true .只会返回已经打开的设备. false返回所有.
//得到做好的位置提者的服务.
return manager.getBestProvider(criteria, true);
}
}