since.2006  

ContentObserver有点类似于BroadcastReceiver,当某类事件发生时进行调用.ContentObserver一般和系统或第三方程序提供的Provider一起使用.

当为某个URI注册了ContentObserver后,对其进行操作后都会调用注册的回调函数,以监视未接电话为例(未读短信和未接电话类似,只需将URI改为短信的URI就可以了):

// 注册ContentObserver
getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, false, new MissedCallContentObserver(this, 

new Handler()));

// 当有call log时,就会对这个类进行回调
public class MissedCallContentObserver extends ContentObserver {
 
 private Context ctx;
 
 private static final String TAG = "MissedCallContentObserver";
 
 public MissedCallContentObserver(Context context, Handler handler) {
  super(handler);
  ctx = context;
 }

 @Override
 public void onChange(boolean selfChange) {
  
  Cursor csr = ctx.getContentResolver().query(Calls.CONTENT_URI, new String[] {Calls.NUMBER, 

Calls.TYPE, Calls.NEW}, null, null, Calls.DEFAULT_SORT_ORDER);
  
  if (csr != null) {
   if (csr.moveToFirst()) {
    int type = csr.getInt(csr.getColumnIndex(Calls.TYPE));
    switch (type) {
    case Calls.MISSED_TYPE:
     Log.v(TAG, "missed type");
     if (csr.getInt(csr.getColumnIndex(Calls.NEW)) == 1) {
      Log.v(TAG, "you have a missed call");
     }
     break;
    case Calls.INCOMING_TYPE:
     Log.v(TAG, "incoming type");
     break;
    case Calls.OUTGOING_TYPE:
     Log.v(TAG, "outgoing type");
     break;
    }
   }
   // release resource
   csr.close();
  }
 }
 
 @Override
 public boolean deliverSelfNotifications() {
  return super.deliverSelfNotifications();
 }
}
Posted by hee at 18:03 PM | Permalink | 评论(2)

常看到G1的版本(固件)有RC30,RC8,RC33,JFV1.31,JFV1.41,ADP1等等,这些有什么区别呢?

打开Settings -> About Phone -> Build number可以看到当前G1的版本,比如:

kila-user 1.1 PLAT-RC33 126986
ota-rel-keys,release-keys

RC33就是通常所说的版本号。

RC系列

由于G1是运营商合作的产物,所以现在分为美版和英版。
美版机器从发布到现在分为RC19、RC28、RC29、RC30、RC31、RC33几个版本。
英版从发布到现在RC5、RC7、RC8几个版本。

美国版本命名基本上是TC4-RCXX,而应该版应该是TC5-RCX。
从RC29到RC30这样的升级,我们可以理解为升级小补丁包,官方进行小幅度更新,弥补漏洞用的。

阅读全文 "G1版本与固件相关" »

Posted by hee at 10:03 AM | Permalink | 评论(0)
http://source.android.com在国内被GFW了,每次偷懒都去用google的网页快照去访问 -_-!!

最近发现一个新地址,可以直接访问
https://sites.google.com/a/android.com/opensource/

其它的方法还可以通过修改hosts文件进行访问

windows下:
在 C:\WINDOWS\system32\drivers\etc\hosts 文件中加入
209.85.171.121  source.android.com

Linux下:
在 /etc/hosts文件中加入
209.85.171.121  source.android.com


Posted by hee at 15:02 PM | Permalink | 评论(0)

在android G1中,除了用内置的market安装.apk应用程序,还有一部分程序是从第三方下载的。这时需要用专门的程序来进行安装。比如ApkInstaller或ASTRO,它们是怎么实现这一功能的呢,下面三行代码即可:

// intent
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file:///sdcard/test.apk"), "application/vnd.android.package-archive");
        
startActivity(intent);

注:以编程方式安装.apk文件一定需要经过用户交互才能完成。上面代码就是调用android系统的安装界面来进行安装。

如果不需要经过用户交互,那就有得玩咯……

 

Posted by hee at 21:01 PM | Permalink | 评论(2)

android源码中是调用IHardwareService来进行屏幕亮度调整的,但在最新的1.0r2,1.0r1 SDK中却找不到这个类。

这时又要翻出0.9的SDK了,在0.9 SDK中android.os包中有相关类。只要将这些相关类添加到项目类路径中,我们也可以用IHardwareService来调整屏幕亮度了。以下代码G1下测试通过。

/**
 * 取得当前用户自定义的屏幕亮度
 */
private int getOldBrightness() {
 int brightness;
 
 try {
  brightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
 } catch (SettingNotFoundException snfe) {
  brightness = 255;
 }
 
 return brightness;
}

/**
 * 设置屏幕亮度
 */
private void setBrightness(int brightness) {
 IHardwareService hardware = IHardwareService.Stub.asInterface(ServiceManager.getService("hardware"));

 if (hardware != null) {
  try {
   hardware.setScreenBacklight(brightness);
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }
}

注意brightness的值为0 - 255,0最暗,255最亮。

阅读全文 "以编程方式改变android屏幕亮度" »

Posted by hee at 10:01 AM | Permalink | 评论(4)

ExFlashlight v0.1

android下仿windows mobile手机上SOS Lite的手电筒程序。

  • 手电筒功能
  • 闪烁功能
  • 用摩尔斯码(Morse Code)发 SOS 送求救信息

比market上的那个flashlight多第2,3项功能,现在还没注册market帐号,先发布在这里。

下载见附件。

 

Posted by hee at 22:01 PM | Permalink | 评论(1)