由于Android 2.x开始很多API变动比较大新增了一些比如多点触控的支持,对于屏幕触控手势识别中我们需要考虑更多的实现方法,下面是一段兼容Android 1.x和2.x的代码,可以让我们的程序兼容几乎99%的Android手机。 一、首先新建一个抽象类判断SDK版本问题 public abstract class VersionedGestureDetector { private static final String TAG = "VersionedGestureDetector"; OnGestureListener mListener; public static VersionedGestureDetector newInstance(Context context, OnGestureListener listener) { //设计实例化构造方法,这里Android123提示大家目前有3种API的实现方法,我们需要逐一考虑最优的解决方法,以满足高平台更多的功能实现。 final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); //使用android.os.Build判断API Level,但需要将字符串转换为整形 VersionedGestureDetector detector = null; if (sdkVersion < Build.VERSION_CODES.ECLAIR) { //如果版本小于2.0则使用1.5版本的API,可以兼容1.5和1.6 detector = new CupcakeDetector(); } else […]
May 2013
StrictMode限制模式API加速你的应用 Android开发技术
从Android 2.3开始提供了一个新的类名为StrictMode可以帮助开发者改进你的Android应用,StrictMode通常可以捕捉到发生在磁盘或网络访问的应用主线程中,可以让主线程处理UI和动画在磁盘读写和网络操作时变得更平滑,避免ANR窗口的发生。 一段示例代码可以很好的说明Android 2.3新特性StrictMode限制模式的工作方式,我们在Activity的onCreate中加入 public void onCreate() { if (DEVELOPER_MODE) { //Android开发网提醒大家,这个标记自己设置一个全局的宏,当然Java中我们用一个Boolean类型设置debug模式好了 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // 这里可以替换为detectAll() 就包括了磁盘读写和网络I/O .penaltyLog() //打印logcat .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() //探测SQLite数据库操作 .penaltyLog() //打印logcat .penaltyDeath() .build()); } super.onCreate(); } 有关Android 2.3的限制模式使用和具体的测试,Android123将在明天详细说明,有兴趣的网友可以查看下SDK文档的android.os.StrictMode,具体的效果和开发改进意见需要进行实际评估。
Android加速感应器开发平衡球代码解析 Android开发技术
如何使用Android的加速感应器开发一个控制铁球滚动的游戏: public class AccelerometerPlayActivity extends Activity { private SimulationView mSimulationView; //游戏主显示View private SensorManager mSensorManager; //感应器管理类 private PowerManager mPowerManager; //电源控制,比如防锁屏 private WindowManager mWindowManager; private Display mDisplay; private WakeLock mWakeLock; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // 实例化感应器管理类 mPowerManager = (PowerManager) getSystemService(POWER_SERVICE); mWindowManager = (WindowManager) […]
扫描和获取OBB文件信息 Android开发技术
今天一起来研究下如何扫描和获取Opaque Binary Blob (OBB)文件信息,有关OBB文件可以在 OBB文件和StorageManager类使用介绍 一文中找到,作为Android 2.3的新特性OBB文件放在SD卡上我们需要通过一种方式识别处理这种文件类型,在android.content.res.ObbScanner类中提供了一个静态的方法来获取一个OBB文件的信息,直接执行ObbScanner.getOBBInfo方法返回一个ObbInfo对象,该方法原型声明为static ObbInfo getObbInfo(String filePath) ,而有关的ObbInfo类是android.os.Parcelable的子类,构造方法比较特殊,如果我们过去写过Android的AIDL服务对这个Parcelable应该不陌生。 ObbInfo类的字段定义如下 public String filename obb文件名 public int flags OBB文件的相关标识,目前只有OBB_OVERLAY则表示补丁覆盖过定义为1 public String packageName 这个obb文件属于哪个packageName的 public int version obb文件版本 ObbInfo的构造方法参考Android123以前提到的Parcelable类相关内容即可 public static final Creator<ObbInfo> CREATOR 提供了三个基础方法 int describeContents() String toString() void writeToParcel(Parcel dest, int parcelableFlags)
Android 2.4改进主要针对平板电脑 Android开发技术
按照目前曝光的消息来看Android 2.4蜂巢可能主要改进用于平板电脑,最终可能在2011年2月份左右发布,届时很多实用NVIDIA Tegra2的平板将会大量采用。 1. NVIDIA Tegra2目前主要使用的厂商有Motorola,目前网上已经曝光了这款MotoPad的原型机图片,最终的设计应该会有变动,不过Tegar2作为一款实用A9架构的双核处理器可能比目前主流的Snapdragon QSD8250这种1GHz的A8架构处理器更有竞争力在多媒体方面。 2. 目前平板电脑中iPad凭借出色的硬件制造工艺已经赢得了不少市场,而手机制造商Motorola、HTC在这种设备制造上可能不如传统的PC制造商如Acer、Asus他们经验丰富。Android 2.4最终将对WSVGA等高分辨率的兼容可以让开发者不考虑过多的UI设计。 3. Android 2.3的升级和改进可以看得出增加了硬件的支持,前置摄像头视频通话、NFC以及更多的感应器可以看出Google目前已经领先其他移动操作系统。 如果你现在考虑购买平板,可能512MB的RAM和Tegra2的CPU是一个明智的选择,不过遗憾的是目前知名品牌中还没有推出相应的解决方案,一切要看2011年了。
电子邮件解析android.net.MailTo类 Android开发技术
如果遇到一个Email的Url如何解析出相关内容呢? android.net.MailTo类可以很好的处理类似 mailto:android123@163.com 这样的电子邮件Url。 String getBody() //从一个Url获取邮件的正文内容 String getCc() //获取抄送地址 Map<String, String> getHeaders() //获取邮件头,比如编码类型,发送时间、IP等等 String getSubject() //获取主题 String getTo() //获取收信人 static boolean isMailTo(String url) //判断一个Url是否包含Email的链接 static MailTo parse(String url) //将一个Url解析成MailTo类
Android流量统计TrafficStats类的使用 Android开发技术
对于Android流量统计来说在2.2版中加入了TrafficStats类可以轻松获取,其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析。android.net.TrafficStats类中,提供了多种静态方法,可以直接调用获取,返回类型均为long型,如果返回等于-1代表 UNSUPPORTED 当前设备不支持统计。 static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数,这里Android123提示大家不包含WiFi static long getMobileRxPackets() //获取Mobile连接收到的数据包总数 static long getMobileTxBytes() //Mobile发送的总字节数 static long getMobileTxPackets() //Mobile发送的总数据包数 static long getTotalRxBytes() //获取总的接受字节数,包含Mobile和WiFi等 static long getTotalRxPackets() //总的接受数据包数,包含Mobile和WiFi等 static long getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等 static long getTotalTxPackets() //发送的总数据包数,包含Mobile和WiFi等 static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数 static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数 最后Android开发网再次提醒开发者,TrafficStats类工作在Android 2.2 API Level为8的固件上。
Android获取摄像头详细信息 Android开发技术
如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头的详细信息,在Android 2.3 SDK中得到了增强: 在android.hardware.Camera类中,API Level 9的SDK中加入了两个比较重要的方法,使用getNumberOfCameras这个static类型方法可以获取当前Android设备上的摄像头数量,比如Nexus S有两个,方法原型如下 public static int getNumberOfCameras () 而对于具体的每个摄像头的信息,可以通过Camera类的getCameraInfo()这个静态方法获取,该方法有两个参数,参数一的ID,我们通过getNumberOfCameras获取的值减1即可,类似数组索引从0开始一样,用循环遍历每个摄像头信息,参数二是android.hardware.Camera.CameraInfo类,有关getCameraInfo方法的原型如下: public static void getCameraInfo (int cameraId, Camera.CameraInfo cameraInfo) 对于Camera.CameraInfo类而言,比较简单,包含两个字段 public int facing 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置 public int orientation 下面是拍照的旋转方向,一般自然些有0度、90度、180度和270度,这样可以获取我们正确的手握设备是横着还是竖着,有关拍照时的方向设置,可以参考下面的代码设置 public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { […]
Android 2.2新增的DeviceAdminInfo类 Android开发技术
在Android 2.2中新增了一个android.app.admin.DeviceAdminInfo类,可以帮助我们以管理员权限获取一个Package信息,DeviceAdminInfo类有一个构造方法为DeviceAdminInfo(Context context, ResolveInfo receiver) 来实例化该类,参数一为目标PackageManager的Context。 ActivityInfo getActivityInfo() 获取该Context的Activity信息,返回一个ActivityInfo对象 ComponentName getComponent() //获取这个Package的Component名称 String getPackageName() //获取这个apk包的package名称 String getReceiverName() //返回所有的receiver名称 String getTagForPolicy(int policyIdent) //返回一些定义的tag根据定义,这里定义的有 USES_POLICY_FORCE_LOCK 、 USES_POLICY_LIMIT_PASSWORD 、USES_POLICY_RESET_PASSWORD 、 USES_POLICY_WATCH_LOGIN和USES_POLICY_WIPE_DATA CharSequence loadDescription(PackageManager pm) //载入一个package的描述 Drawable loadIcon(PackageManager pm) //这里android123提示对于apk文件在2.2中推荐的获取icon方法 CharSequence loadLabel(PackageManager pm) //获取软件名称 boolean usesPolicy(int policyIdent) //参数定义参考上面的getTagForPolicy
UiModeManager设置夜间模式和行车模式 Android开发技术
Android在2.2时新增了一个实用的类UiModeManager可以方便的管理当前Android设备的夜间模式和行车模式,位于android.app.UiModeManager这个包中。UiModeManager类使用Context.getSystemService(Context.UI_MODE_SERVICE) 来实例化,主要提供了以下几种方法 void disableCarMode(int flags) // 禁止行车模式,这里参数一般为UiModeManager.DISABLE_CAR_MODE_GO_HOMEvoid enableCarMode(int flags) // 启用行车模式,这里参数一般为UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME 这里Android123提示大家,在Android 2.2开始引入了另一种主题为Car Home,进入后手机的图标会更大,适合开车的人使用手机播放音乐,控制导航什么的。 int getCurrentModeType() //返回当前的模式,返回值有三种情况,夜间模式自动 MODE_NIGHT_AUTO ,夜间模式关闭 MODE_NIGHT_NO 和夜间模式开启 MODE_NIGHT_YES 夜间模式主要是设置Car Home主题的背景颜色,可以帮助我们在夜间或白天看清楚,就像很多GPS导航软件夜间模式和后地图背景为纯黑,看起来不是那么刺眼。 int getNightMode() //获取夜间模式状态 void setNightMode(int mode) //设置夜间模式。 同时UiModeManager类还提供了四个action定义,比如进入行车模式 ACTION_ENTER_CAR_MODE,进入桌面模式ACTION_ENTER_DESK_MODE,退出行车模式 ACTION_EXIT_CAR_MODE 和退出桌面模式ACTION_EXIT_DESK_MODE。
Android开发图书推荐 Android开发技术
很多入门Android开发者网友还是喜欢看书学习,对于SDK文档和ApiDemo等还无法快速了解,Android123在元旦给大家推荐两本入门级别的图书,作为图灵教育的书籍在质量等方面还有有保证的。 第一本为 《Android开发入门教程》 是原书 Beginning Android 2 的翻译版本 ,定价59.00元一般在44元左右可以买到。 第二本为 《精通Android 2》是原书 Pro Android 2 的翻译版本,定价89.00元,一般66元左右可以买到。 这两本书整体内容比较简单,对于Android开发的常见问题都已经提到,经Android123试读国外原版描述问题等方面都很到位准确,相对于国内的书籍来说更适合入门级Android开发者快速掌握,没有任何啰嗦或语义不清晰等问题。一般Android开发网很少推荐图书,毕竟中高级的技术开发者很少有空出书,所以大家学习掌握技术时还是要靠自己多研究源码。

