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();
}
}
常看到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这样的升级,我们可以理解为升级小补丁包,官方进行小幅度更新,弥补漏洞用的。
在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系统的安装界面来进行安装。
如果不需要经过用户交互,那就有得玩咯……
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最亮。
ExFlashlight v0.1
android下仿windows mobile手机上SOS Lite的手电筒程序。
比market上的那个flashlight多第2,3项功能,现在还没注册market帐号,先发布在这里。
下载见附件。