Pages:  1 2 3 4 5 6 7 ... 21 22
lytsing – Page 6 – lytsing's Blog

Author: lytsing

  • Android 上的消息推送通知(Push Notification)

    Android froyo 之后,引入了 C2DM,基于XMPP 协议实现的推送机制。C2DM 的优点无需多言,但缺点也是显而易见:
    1. 需要google账号。这一点约束太大了,很多手机厂家把google Apps给阉割了。
    2. 国内服务不稳定,原因你懂得的。如果有能力在国外有服务器,可以很快的发送消息到C2DM 服务器,从国内post 数据到 Google server,几乎没响应。
    3. C2DM 仅支持 Android 2.2 以上

    C2DM 运行在系统级别上,系统内存少时不容易被kill。C2DM与Gmail、Gtalk等共用同一个连接,减少耗电。跟iOS不一样,Android支持App常驻进程,所以大家都不愿意用。现在一些恶意的Android软件,安装后后台开启一个服务,定时向用户PUSH垃圾广告,很邪恶。国内互联网公司都瞎折腾这样那样云,但就没有一家愿意开发和提供一个Google C2DM的墙内替代品。

    目前基于长连接push的开源软件有:

    AndroidPN

    AndroidPN 是一个基于XMPP协议的java开源Android push Notification 实现,包含server与client,server 使用SSH框架,默认后台使用jetty,数据库是hsqldb,该服务器端基本上是在openfire基础上修改实现的,据说微信在Android上的推送实现也是基于openfire,具体未详。官方上的版本已经很久没更新,而且还有一些bugs,比如:
    1. 当服务器端重启的时候,客户端就无法在连接到服务器.
    2. 不支持离线消息。
    3. 推送多条消息重复问题

    可以改造成tomcat版本,已经有很多网友在做这样的事。

    MQTT

    IBM 产品,使用php写的,据说外国网友在论坛上爆料,Facebook Android客户端的推送使用这个。

    没有条件自己搞 push 服务器的,可以使用第三方服务

    Urban Airship http://urbanairship.com/
    http://www.push-notification.org/
    http://www.android-push.com/

    据了解,钱方支付的 Android 客户端是使用 http://www.android-push.com/ 的服务。

  • PHP: Thread Safety disable

    Debug php core dump 文件,遇到:No symbol “executor_globals” in current context. PHP EG在非多线程情况下 executor_globals 保持了很多执行状态。需要把 Thread Safety 关闭掉,使用 <?php phpinfo(); ?> 即可看出是否支持。我所用的版本是 php-5.4.4 httpd-2.4.2,先编译apache,./configure 带上

     --with-mpm=prefork

    prefork模式,实现了一个非线程型的、预派生的web服务器,还有另外一个是 worker模式,支持多线程多进程。
    php ./configure 带上

    --with-apxs2=/usr/local/apache2/bin/apxs 

    参考:

  • BlackBerry 学习杂记

    我们收到BlackBerry 提供一部9800 手机,三本书《黑莓(BlackBerry)开发从入门到精通》。大概翻翻这本不是很厚的书,写应用跟gtk类似,精髓部分是 push。

    开发环境搭建,花了一个下午的时间尝试,不支持在 Linux 下开发,最佳开发环境是windows,mac 扭扭捏捏支持,但无法运行模拟器,只能编译好了,debug跑在真机上,把app package 到真机,花的时间特别长,而且每装个应用,都得重启系统,对于开发很不方便。BB申请签名,准备挨20美刀,填写表单时,她告诉我,BlackBerry Code Signing Keys are now absolutely free! 看来书与文档过时很快。

    其中,我们比较关心音频播放与录音,在sdk 可以 import很多 samples 示例,Record audio in a BlackBerry device application 是不错的参考 demo。浏览官方开发网站,提供了很多代码,一些放在github上,也值得看看。貌似BB开发者不是很多,Google一些API代码,搜索记录寥寥无几。我们公司就只有客服MM使用BlackBerry,那是一个很特别的女孩。BlackBerry对我们提供很好技术支持,我们也要努力加油,尽快开发出BB 客户端。

  • Sqaure 类产品在Android 机型上的适配问题

    我们已经公布了 盒子支付客户端支持机型列表 ,而Sqaure 也很早在他们帮助中心提示用户他们对Android 设备的兼容情况。很多用户很关心他们的机型为什么不支持。

    众所周知,Android碎片化的问题确实困扰的不少的应用开发商,Animoca 公司最近也大倒苦水,他们购买了400多款手机对应用进行质量测试。

    有人问,为何Square与国内的一些公司支持的 Android 机型比你们更多?因为他们跟盒子支付的音频数据方式完全不一样,他们传输数据量小,通讯不加密且只能单向通讯。实现原理比较简单:通过MIC口实现数据接收,使用 android.media.AudioRecord 实现录音,并对采集下来的模拟信号进行处理。主流的音频通讯速率 1.1k/2.2K,传输的数据有限,对于数据量大,也就需要做更多的校验,保证数据传输正确。

    那难点在哪呢?

    一、硬件问题
    1. Android 厂商硬件配置不一致,需要购买很多机型一个个去调试。
    2. 音频口供电电压高低不一,电压不够带动驱动的,需要加上电池供电。
    3. 音频口引脚接线也尽不相同。像 moto xt800,有些厂家针对这款机器在硬件上做了适配。
    4. 录音得出的波形不满足要求,录音失真,回路干扰等。
    5. 音频口硬件接触不良,插口比较宽或比较深。
    6. 输出过大。

    二、软件问题
    厂商修改 framework 层代码。一些手机原装ROM可以跑,但刷了第三方ROM就出现了问题。传说中的小米手机统常出现线程操作问题,乱跑。

  • Android 屏蔽线控耳机

    研究了Square Android 应用,它在刷卡界面监测耳机按钮事件,全部屏蔽掉线控事件。

    MediaButtonDisabler.java:

    package org.lytsing.square;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.util.Log;
    
    public class MediaButtonDisabler extends BroadcastReceiver {
    
        private static final String TAG = "MediaButtonDisabler";
    
        private static final BroadcastReceiver INSTANCE = new MediaButtonDisabler();
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "Intercepted media button.");
    
            abortBroadcast();
        }
    
        public static void register(Context context) {
            IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
            filter.setPriority(Integer.MAX_VALUE);
            context.registerReceiver(INSTANCE, filter);
        }
    
        public static void unregister(Context context) {
            context.unregisterReceiver(INSTANCE);
        }
    }

    简要说明,设置过滤优先级为最高,int 的最大值(2^32 – 1 = 2147483647),这样,就会在第一时间把线控事件的广播中止,使其他应用无法接收到。

    在Activity 调用:

        @Override
        protected void onPause() {
            super.onPause();
            
            MediaButtonDisabler.unregister(this);
        }
        
        @Override
        protected void onResume() {
            super.onResume();
            
            MediaButtonDisabler.register(this);
        }

    另外,我们发现一些Android手机在音频口插入我们的盒子读卡器后,音乐播放器乱放,反复播放又暂停又播放,开始以为是线控问题,屏蔽掉后,问题依旧。有做这方便的朋友,可以交流交流,分享一下。