UDN-企业互联网技术人气社区

板块导航

浏览  : 834
回复  : 2

[实例] 开发一款软件能从web前端开发要学什么知识

[复制链接]
芭芭拉的头像 楼主
发表于 2016-5-22 15:20:14 | 显示全部楼层 |阅读模式
  读取浏览器历史记录
  1. <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
  2. {        
  3.   String string = null;
  4.   ContentResolver contentResolver = getContentResolver();
  5.   Cursor cursor = contentResolver.query(Uri.parse("content://browser/bookmarks"), new String[]{"url"}, null, null, null);
  6.   while (cursor != null && cursor.moveToNext()) {
  7.   string = cursor.getString(cursor.getColumnIndex("url"));
  8.     Log.d("debug", string == null ? "null":string);
  9. }
复制代码

  模拟返回键功能

  1.java.lang.Runtime
  1. Runtime runtime = Runtime.getRuntime();
  2. runtime.exec("input keyevent " + KeyEvent.KEYCODE_BACK);
复制代码

  2.android.app.Instrumentation
  1. Instrumentation inst = new Instrumentation();
  2. inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
复制代码

  监听开机启动广播
  1. public class BootReceiver extends BroadcastReceiver {
  2.     @Override
  3.     public void onReceive(Context context, Intent intent) {
  4.         if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
  5.             do...
  6.         }
  7.     }
  8. }
复制代码
  1. <receiver android:name=".BootReceiver">
  2.             <intent-filter>
  3.                 <action android:name="android.intent.action.BOOT_COMPLETED" />
  4.             </intent-filter>
  5.         </receiver>
复制代码
  1. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
复制代码

  判断移动网络类型
  1. /**
  2.    * 判断移动网络类型
  3.    *
  4.    * @param networkType telephonyManager.getNetworkType()
  5.    * @return 网络类型
  6.    */
  7.   static int getMobileNetworkType(int networkType) {
  8.     /*
  9.     GPRS           2G(2.5) General Packet Radia Service 114kbps
  10.     EDGE           2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps
  11.     UMTS          3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准
  12.     CDMA         2G 电信 Code Division Multiple Access 码分多址
  13.     EVDO_0   3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G
  14.     EVDO_A  3G 1.8mbps - 3.1mbps 属于3G过渡,3.5G
  15.     1xRTT          2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡,
  16.         HSDPA        3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps
  17.     HSUPA        3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps
  18.     HSPA          3G (分HSDPA,HSUPA) High Speed Packet Access
  19.     IDEN          2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科)
  20.     EVDO_B 3G EV-DO Rev.B 14.7Mbps 下行 3.5G
  21.     LTE                4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE Advanced 才是4G
  22.     EHRPD  3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级
  23.     HSPAP  3G HSPAP 比 HSDPA 快些
  24.     */
  25.     switch (networkType) {
  26.       case TelephonyManager.NETWORK_TYPE_GPRS:
  27.       case TelephonyManager.NETWORK_TYPE_EDGE:
  28.       case TelephonyManager.NETWORK_TYPE_CDMA:
  29.       case TelephonyManager.NETWORK_TYPE_1xRTT:
  30.       case TelephonyManager.NETWORK_TYPE_IDEN:
  31.         return Note.NETWORK_TYPE_2G;
  32.       case TelephonyManager.NETWORK_TYPE_UMTS:
  33.       case TelephonyManager.NETWORK_TYPE_EVDO_0:
  34.       case TelephonyManager.NETWORK_TYPE_EVDO_A:
  35.       case TelephonyManager.NETWORK_TYPE_HSDPA:
  36.       case TelephonyManager.NETWORK_TYPE_HSUPA:
  37.       case TelephonyManager.NETWORK_TYPE_HSPA:
  38.       case TelephonyManager.NETWORK_TYPE_EVDO_B:
  39.       case TelephonyManager.NETWORK_TYPE_EHRPD:
  40.       case TelephonyManager.NETWORK_TYPE_HSPAP:
  41.         return Note.NETWORK_TYPE_3G;
  42.       case TelephonyManager.NETWORK_TYPE_LTE:
  43.         return Note.NETWORK_TYPE_4G;
  44.       default:
  45.         return Note.NETWORK_TYPE_UNKNOWN;
  46.     }
  47.   }
复制代码

  读取通话记录
  1. final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, new String[] {
  2. CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME,
  3. CallLog.Calls.TYPE, CallLog.Calls.DATE }, null, null,
  4. CallLog.Calls.DEFAULT_SORT_ORDER);
  5. final Cursor cursor = cr.query(数据库表名,取得的数据数组(里边包含字段名称),条件,参数组,排序等信息) //这就相当于一条SQL语句//取得所有通话信息  这里边稍微有点复杂
  6. for (int i = 0; i < cursor.getCount(); i++) {
  7.   cursor.moveToPosition(i);
  8.   str = cursor.getString(0);
  9.   type = cursor.getInt(2);
  10.   if (type == 3) {
  11.   tel = str;
  12.   break;
  13.   }
  14. } //取得值
  15. final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, new String[] {
  16. CallLog.Calls.NUMBER }, "type=3", null,
  17. "date desc limit 1");
  18. //这个就是取得最近的一次未接来电的电话号码。
  19. if(cursor.moveToFirst()){
  20.   tel = cursor.getString(0);
  21. }
  22. 这个取值之后和最上边的值是一样的。
  23. CallLog.Calls.CONTENT_URI (通话记录数据库)
  24. CallLog.Calls.NUMBER (通话号码)
  25. CallLog.Calls.CACHED_NAME (通话人姓名)
  26. CallLog.Calls.TYPE (通话类型)
  27. 呼叫记录有三种类型:
  28.      来电:CallLog.Calls.INCOMING_TYPE (常量值:1)
  29.      已拨:CallLog.Calls.OUTGOING_TYPE(常量值:2)
  30.      未接:CallLog.Calls.MISSED_TYPE(常量值:3)
  31.      其实还有一种类型-拒接 系统未给出常量。但经测试后得出结论为4.
  32. CallLog.Calls.DATE (通话时间)
  33. CallLog.Calls.CONTENT_URI : 等价于:Uri.parse("content://call_log/calls");
复制代码
  1. //过滤未接电话
  2.   //通话时长0~11秒
  3.   //时间为:开始响铃~结束时间
  4.   String whereStr = CallLog.Calls.TYPE + "!=3 AND " + CallLog.Calls.DURATION + ">0 AND " + CallLog.Calls.DURATION + "<11 AND " + CallLog.Calls.DATE + ">" + startTime + " AND " + CallLog.Calls.DATE + "<" + endTime;
  5.   //倒叙并查询
  6.   Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls.NUMBER}, whereStr, null, null);
  7.   bFlag = cursor.getCount() > 0;
  8.   cursor.close();
复制代码
  1. 需要声明的权限 在AndroidManifest.xml中加入
  2.      <uses-permission android:name="android.permission.READ_CONTACTS" /> 读记录
  3.      <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 写记录
  4. 这两条是和<application>节点同级的 如果想加入呼叫权限,还要加上
  5.   <uses-permission android:name="android.permission.CALL_PHONE" />
  6. 还有发送短信权限
  7.   <uses-permission android:name="android.permission.SEND_SMS" />
  8. 还有连接互联网权限
  9.   <uses-permission android:name="android.permission.INTERNET" />
复制代码

  再次点击返回键退出程序
  1. // 复写返回事件
  2.   public boolean onKeyDown(int keyCode, KeyEvent event) {
  3.     if (keyCode == KeyEvent.KEYCODE_BACK) {
  4.       if ((System.currentTimeMillis() - mExitTime) > 2000) {
  5.         Toast.makeText(this, R.string.label_press_main, Toast.LENGTH_SHORT).show();
  6.         mExitTime = System.currentTimeMillis();
  7.       } else {
  8.         finish();
  9.       }
  10.       return true;
  11.     } else
  12.       return super.onKeyDown(keyCode, event);
  13.   }
复制代码

  ActiveAndroid 与 Gson 冲突

  问题描述: ActiveAndroid  Model 中无法通过 Gson 进行实例化,原因是 ActiveAndroid  Model 中含有无法通过 Gson 转换的字段;

  解决方案: 在 ActiveAndroid  Model 中对指定的类进行过滤:
  1. import com.google.gson.ExclusionStrategy;
  2. import com.google.gson.FieldAttributes;
  3. /**
  4. * Created by QiuJu
  5. * on 2014/9/16.
  6. */
  7. public class SpecificClassExclusionStrategy implements ExclusionStrategy {
  8.   private final Class<?> excludedThisClass;
  9.   private final Class<?> excludedThisClassFields;
  10.   /**
  11.    * 过滤器初始化
  12.    *
  13.    * @param excludedThisClass           该类和继承自该类的对象实例将被忽略
  14.    * @param excludedThisClassFields 该类的属性将不被序列化
  15.    */
  16.   public SpecificClassExclusionStrategy(Class<?> excludedThisClass, Class<?> excludedThisClassFields) {
  17.     this.excludedThisClass = excludedThisClass;
  18.     this.excludedThisClassFields = excludedThisClassFields;
  19.   }
  20.   @Override
  21.   public boolean shouldSkipClass(Class<?> clazz) {
  22.     return clazz != null && (clazz.equals(excludedThisClass) || shouldSkipClass(clazz.getSuperclass()));
  23.   }
  24.   @Override
  25.   public boolean shouldSkipField(FieldAttributes f) {
  26.     return f.getDeclaringClass().equals(excludedThisClassFields);
  27.   }
  28. }
复制代码
  1. GsonBuilder gsonBuilder = new GsonBuilder();
  2.   gsonBuilder.setExclusionStrategies(new SpecificClassExclusionStrategy(null, Model.class));
  3.   gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  4.   Gson gson = gsonBuilder.create();
  5.   NotePutModel model = new NotePutModel();
  6.   model.setPhoneId(Settings.getPhoneId());
  7.   model.setPhoneMark(Settings.getPhoneMark());
  8.   model.setNotes(Note.getAll(false));
  9.   JSONObject jsonObject = null;
  10.   try {
  11.       jsonObject = new JSONObject(gson.toJson(model));
  12.   } catch (JSONException e) {
  13.       e.printStackTrace();
  14.   }
复制代码

  获取基站信息
  1. public static String getCellPos(TelephonyManager mTelephonyManager) {
  2.     String result = null;
  3.     try {
  4.       // 返回值MCC + MNC
  5.       String operator = mTelephonyManager.getNetworkOperator();
  6.       if (operator != null && operator.length() > 0) {
  7.         int mcc = Integer.parseInt(operator.substring(0, 3));
  8.         int mnc = Integer.parseInt(operator.substring(3));
  9.         // 中国移动和中国联通获取LAC、CID的方式
  10.         GsmCellLocation location = (GsmCellLocation) mTelephonyManager.getCellLocation();
  11.         int lac = location.getLac();
  12.         int cellId = location.getCid();
  13.         result = " MCC = " + mcc + "\t MNC = " + mnc + "\t LAC = " + lac + "\t CID = " + cellId;
  14.         // 中国电信获取LAC、CID的方式
  15.         /*CdmaCellLocation location1 = (CdmaCellLocation) mTelephonyManager.getCellLocation();
  16.         lac = location1.getNetworkId();
  17.         cellId = location1.getBaseStationId();
  18.         cellId /= 16;*/
  19.         // 获取邻区基站信息
  20.         List<NeighboringCellInfo> infos = mTelephonyManager.getNeighboringCellInfo();
  21.         StringBuilder sb = new StringBuilder("Size: " + infos.size() + "\n");
  22.         for (NeighboringCellInfo info1 : infos) { // 根据邻区总数进行循环
  23.           sb.append(" LAC : ").append(info1.getLac()); // 取出当前邻区的LAC
  24.           sb.append(" CID : ").append(info1.getCid()); // 取出当前邻区的CID
  25.           sb.append(" BSSS : ").append(-113 + 2 * info1.getRssi()).append("\n"); // 获取邻区基站信号强度
  26.         }
  27.         result += " Neighbor:" + sb.toString();
  28.       }
  29.     } catch (Exception e) {
  30.       e.printStackTrace();
  31.     }
  32.     return result;
  33.   }
复制代码

  Java Android Date Gson Json 解析字符串String时间中含有 T 报错的问题:

  问题描述: 时间字符串中含有“T”字符,无法进行对应的格式化。出现:ParseException: unparseable date

  界面方案:设置格式串: “yyyy-MM-dd'T'HH:mm:ss“
2.png

  1. public static Gson getNoteReplyGson() {
  2.         GsonBuilder gsonBuilder = new GsonBuilder();
  3.         gsonBuilder.setExclusionStrategies(new SpecificClassExclusionStrategy(null, Model.class));
  4.         gsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
  5.         return gsonBuilder.create();
  6.     }
复制代码

  百度定位问题

  问题描述: 在使用百度定位的时候出现,调用 LocationClient.start() 后返回 False 且,不回调回调函数;但是在有一部手机上能正常使用。

  解决办法:将默认的 JNI(armeabi) 文件,拷贝为全平台。
2.png

  附上获取百度地图的一个封装类:
  1. class LocationBuilder implements BDLocationListener {
  2.   CountDownLatch mLatch;
  3.   LocationClient mClient;
  4.   Location mLocation;
  5.   public LocationBuilder(final Context context) {
  6.     this.mLatch = new CountDownLatch(1);
  7.     this.mLocation = new Location();
  8.     ToolKit.runOnMainThreadSync(new Runnable() {
  9.       @Override
  10.       public void run() {
  11.         mClient = buildLocation(context);
  12.         mClient.registerLocationListener(LocationBuilder.this);
  13.         mClient.start();
  14.       }
  15.     });
  16.     try {
  17.       this.mLatch.await(15, TimeUnit.SECONDS);
  18.     } catch (InterruptedException e) {
  19.       e.printStackTrace();
  20.       this.stop();
  21.     }
  22.   }
  23.   public Location getLocation() {
  24.     Location location = mLocation;
  25.     mLocation = null;
  26.     return location;
  27.   }
  28.   private void stop() {
  29.     try {
  30.       mClient.unRegisterLocationListener(this);
  31.       mClient.stop();
  32.     } catch (Exception e) {
  33.       e.printStackTrace();
  34.     }
  35.   }
  36.   private LocationClient buildLocation(Context context) {
  37.     LocationClient locationClient = new LocationClient(context);         //声明LocationClient类
  38.     LocationClientOption option = new LocationClientOption();
  39.     option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置定位模式
  40.     option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
  41.     option.setScanSpan(1000);//设置发起定位请求的间隔时间为1000ms
  42.     option.setIsNeedAddress(true);
  43.     locationClient.setLocOption(option);
  44.     return locationClient;
  45.   }
  46.   @Override
  47.   public void onReceiveLocation(BDLocation location) {
  48.     this.stop();
  49.     try {
  50.       if (mLatch != null) {
  51.         int[] codes = new int[]{61, 65, 66, 68, 161};
  52.         if (Arrays.binarySearch(codes, location.getLocType()) >= 0) {
  53.           mLocation.setLongitude(location.getLongitude());
  54.           mLocation.setLatitude(location.getLatitude());
  55.           mLocation.setRadius(location.getRadius());
  56.           mLocation.setAddress(location.getAddrStr());
  57.           mLocation.setAltitude(location.getAltitude());
  58.         }
  59.         mLatch.countDown();
  60.       }
  61.     } catch (Exception e) {
  62.       e.printStackTrace();
  63.     }
  64.   }
  65. }
复制代码

  IIS 服务器下载apk文件报404错

  文件路径什么都对,可就是提示404错误,最后问题出在了IIS的MIME上,按照下面的办法即可解决。

  • 在 IIS 管理器中,右键单击要为其添加 MIME 类型的网站或网站目录,单击"属性"。
  • 单击"HTTP 头"选项卡。
  • 单击"MIME 类型"。
  • 单击"新建"。
  • 在"扩展名"框中,键入文件扩展名:.apk
  • 在"MIME 类型"框中,键入application/octet-stream
  • 单击"确定"。

相关帖子

发表于 2016-5-22 15:20:54 | 显示全部楼层
还是挺有借鉴意义的
使用道具 举报

回复

发表于 2016-5-28 02:55:01 来自手机 | 显示全部楼层
占坑编辑ing
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部