手机卫士功能点之---广播事件和engine包

<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);
	}
}



















你可能感兴趣的:(手机卫士功能点之---广播事件和engine包)