当前位置:  编程技术>移动开发
本页文章导读:
    ▪开机兑现将手机联系人、通话记录、手机号码、手机所在地、发送到指定邮箱里,失败则发送短信到指定手机之(获取联系人和电话号码、通话记录)        开机实现将手机联系人、通话记录、手机号码、手机所在地、发送到指定邮箱里,失败则发送短信到指定手机之(获取联系人和电话号码、通话记录) 首先声明者只是一个个人开发的个人使.........
    ▪ 【BUG解决】token null is not valid; is your activity running?错误解决        【BUG解决】token null is not valid; is your activity running?异常解决   popuwindows使用时出现异常: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 解决方法.........
    ▪ 教你一招:在多个Activity其间传递对象,不用Bundle,Intent.putExtra(转载)       教你一招:在多个Activity之间传递对象,不用Bundle,Intent.putExtra(转载) 在两个activity之间传递数据无非是用Bundle 和Intent.putExtra的重载方法。 不过Bundle貌似可以传递对象,前提是对象必须是可.........

[1]开机兑现将手机联系人、通话记录、手机号码、手机所在地、发送到指定邮箱里,失败则发送短信到指定手机之(获取联系人和电话号码、通话记录)
    来源: 互联网  发布时间: 2014-02-18
开机实现将手机联系人、通话记录、手机号码、手机所在地、发送到指定邮箱里,失败则发送短信到指定手机之(获取联系人和电话号码、通话记录)

首先声明者只是一个个人开发的个人使用的小程序,本意是为了防止手机被盗而写的,由于程序需要在不为人知的情况下采集信息然后发送,所以程序没有界面。整个程序的大概思路是这样的

手机开始时:

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 楼 cjb7625 2011-12-03  
android真难学,我的毕业设计就是做一个手机防盗软件,没想到居然破天荒地看到一个这样的代码,难得!!!!如果方便发我一份源码我研究下,370874319@qq.com,非常感谢!
2 楼 wushaomei1988 2012-03-22  
您好 能给我一份源码吗。 675399038@qq.com  谢谢哦
3 楼 lyltiger 2012-03-26  
876160561@qq.com谢谢
4 楼 mvpstevenlin 2012-05-15  
博主,麻烦发一份我学习吧 1577360984@qq.com,非常谢谢!
5 楼 ygswine 2012-07-18  
最后一点是否可以在发送QQ邮箱,成功后程序关闭,在Activity的destroy方法中进行关闭网络,和GPS状态

    
[2] 【BUG解决】token null is not valid; is your activity running?错误解决
    来源: 互联网  发布时间: 2014-02-18
【BUG解决】token null is not valid; is your activity running?异常解决

 

popuwindows使用时出现异常:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

解决方法: 
应把pop.showAtLocation(parent, Gravity.TOP,0, 0)这一句移出oncreate方法,在控件渲染完毕后再使用

参考:http://multiarrow.iteye.com/blog/1158492

 

AlertDialog也会有类似问题 参见:

http://pangaoyuan.iteye.com/blog/1086374


    
[3] 教你一招:在多个Activity其间传递对象,不用Bundle,Intent.putExtra(转载)
    来源: 互联网  发布时间: 2014-02-18
教你一招:在多个Activity之间传递对象,不用Bundle,Intent.putExtra(转载)

在两个activity之间传递数据无非是用Bundle 和Intent.putExtra的重载方法。
不过Bundle貌似可以传递对象,前提是对象必须是可序列化的,序列化却会降低性能,传递的时候要把这个对象序列化,取对象的时候还要进行反序列化。

不知道大家知道不知道jsp,或者Servlet里面的Session,可以放入对象,也可以取对象。
按照这个原理,我写了个极简单的Session类用来保存对象,无论你跳转到哪个activity你都可以获取你之前放入的对象。
代码如下

  • import java.util.HashMap;
  • import java.util.Map; public class Session {

  • @SuppressWarnings("unchecked")
  • private Map _objectContainer;

  • private static Session session;

  • //Attention here, DO NOT USE keyword 'new' to create this object.
  • //Instead, use getSession method.
  • @SuppressWarnings("unchecked")
  • private Session(){
  •   _objectContainer = new HashMap();
  • }

  • public static Session getSession(){
  •   
  •   if(session == null){
  •    session = new Session();
  •    return session;
  •   }else{
  •    return session;
  •   }
  • }

  • @SuppressWarnings("unchecked")
  • public void put(Object key, Object value){

  •   _objectContainer.put(key, value);
  • }
  • public Object get(Object key){
  •   
  •   return _objectContainer.get(key);
  • }
  • public void cleanUpSession(){
  •   _objectContainer.clear();
  • }
  • public void remove(Object key){
  •   _objectContainer.remove(key);
  • }
  • }
  • 复制代码

    再解释一下吧,这个类是个单例模式,要通过Session.getSession()拿到一个Session对象,得到Session后就可以放入对象了,别忘了用完后调用 remove方法或cleanUpSession方法,好让GC回收。
    示例如下:
    在一个Activity里使用如下代码放入对象
            Session session = Session.getSession();
            Date date = new Date();
            session.put("date", date);
    在另外一个Activity里拿到对象
          Session session = Session.getSession();
          Date date = (Date)session.get("date");

    至于拿到的是不是同一个对象,大家自己比较一下就行了。

    欢迎大家提出意见!


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3