Menu Home

framework

Android:How to change MTP and PTP name

Android OS: 4.4.4 Sometimes, you want to change the default MTP/PTP name of your android device. If you have android source, it’s very easy. First open the source file: frameworks/base/media/java/android/mtp/MtpDatabase.java, Line:799(in my source), or you can search the function getDeviceProperty private int getDeviceProperty(int property, long[] outIntValue, char[] outStringValue) { switch […]

Framework增加资源文件

把需要增加的图片资源放到 frameworks/base/core/res/res/drawable-nodpi,如果就这样直接应用这个资源,会出现找不到资源的错误。实际上在增加完资源后还需要在 frameworks/base/core/res/res/values/symbols.xml文件中做相应的注册,比如: <java-symbol type=”drawable” name=”my_wallpaper” /> 重新编译framework-res后就可以使用这个资源了: com.android.internal.R.drawable.my_wallpaper

Android Framework: 重启代码

private void RebootIntoRecovery() { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); pm.reboot(“recovery”); } <uses-permission android:name=”android.permission.REBOOT” /> <manifest xmlns:android=”http://schemas.android.com/apk/res/android” package=”com.android.settings” coreApp=”true” android:sharedUserId=”android.uid.system”>

Android电源管理-Healthd (2)

接上文 Android电源管理-Healthd (1) adb shell进入到/sys/class/power_supply目录,我们可以看到power_supply驱动创建的一些运行时文件(我的设备是Nuxus 7, Android 4.4.2, kernel 3.4.0): adb root adb shell cd /sys/class/power_supply ll 输出如下: lrwxrwxrwx root root 2014-09-19 14:30 ac -> ../../devices/i2c-0/0-0055/power_supply/ac lrwxrwxrwx root root 2014-09-19 14:30 battery -> ../../devices/i2c-0/0-0055/power_supply/battery lrwxrwxrwx root root 2014-09-19 14:30 usb -> ../../devices/i2c-0/0-0055/power_supply/usb lrwxrwxrwx root root 2014-09-19 14:30 wireless -> ../../devices/i2c-0/0-0055/power_supply/wireless […]

Android电源管理-Healthd (1)

OS:Android 4.4.2 Android电源管理底层用的是Linux power supply框架。驱动部分不叙述。只看JAVA、JNI和CPP应用层。 从Android 4.4开始,Google专门提供了一个healthd来监控电源状态。它的路径在:system/core/healthd,编译出来的文件为/sbin/healthd。 看一下healthd.cpp中的main函数: int main(int argc, char **argv) { int ch; klog_set_level(KLOG_LEVEL); while ((ch = getopt(argc, argv, “n”)) != -1) { switch (ch) { case ‘n’: nosvcmgr = true; break; case ‘?’: default: KLOG_WARNING(LOG_TAG, “Unrecognized healthd option: %c\n”, ch); } } healthd_board_init(&healthd_config); wakealarm_init(); uevent_init(); binder_init(); […]

Android Framework: 自定义系统选项

Android系统默认提供了一些Contont Provider,如 Contacts Provider、Documents Provider、Settings Provider等等。这些provider源码都放在frameworks/base/core/java/android/provider文件夹中。 当我们需要自定义一些系统设置,比如在Settings界面中增加了一个设置keyguard特效的选项,当用户在Settings界面中设置了某个特效后,keyguard那边能够读取这个设置项,并做出相应的改变。很显然的这里涉及到IPC,通常我们可以自己写一个Provider,但如果你有源码就完全可以复用Android提供的已有Settings Provider,达到简洁统一。 打开frameworks/base/core/java/android/provider/Settings.java文件,导航到NameValueCache类。在这个类中你会看到很多我们熟悉的一些系统设置(WIFI、亮度等等),这些值都会储存到数据库中(系统的或者用户的)。我们在这个类中增加一个常量来标记我们新增的设置项: public static final String KEYGUARD_TRANSITION_TYPE = “keyguard_transition_type”; 修改完之后需要重新编译一下framework。 现在Settings Provider中有了我们需要的字段,下一步就是怎么往里存储和读取了。方法很简单,从上面Settings.java文件中可以看到有很多put*和get*方法,我们可以使用这些方法来对NameValueCache中声明的字段进行存取操作。 import static android.provider.Settings.System.KEYGUARD_TRANSITION_TYPE; Settings.System.putInt(getContentResolver(), KEYGUARD_TRANSITION_TYPE, value); int currentValue = Settings.System.getInt( getContentResolver(), KEYGUARD_TRANSITION_TYPE,); Settings.System.putIntForUser(getContentResolver(), KEYGUARD_TRANSITION_TYPE, value, UserHandle.USER_CURRENT); int currentValue = Settings.System.getIntForUser( getContentResolver(), KEYGUARD_TRANSITION_TYPE, UserHandle.USER_CURRENT); 需要注意的是上面带有用户参数的方法(*ForUser)是Hide属性的。 最后需要一个数据监听器,这样才能做到实时更新选项: private static final Uri mUri = […]

Android: 监听切换用户事件

try{ ActivityManagerNative.getDefault().registerUserSwitchObserver( new IUserSwitchObserver.Stub() { @Override public void onUserSwitching(int newUserId, IRemoteCallback reply) { switchUser(newUserId, reply);//Here, you can do something you want } @Override public void onUserSwitchComplete(int newUserId) throws RemoteException { } }); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ref : frameworks/base/services/java/com/android/server/WallpaperManagerService.java : 519

Android framework: 一种用于临时打开和关闭屏幕自动旋转的方法

这种方法的前提是你需要能编译Android framework。如果不能,可以试试 这个 。 其实在frameworks/base/services/java/com/android/server/wm/WindowManagerService.java中有下面两个方法: /** * Temporarily pauses rotation changes until resumed. * * This can be used to prevent rotation changes from occurring while the user is * performing certain operations, such as drag and drop. * * This call nests and must be matched by an equal […]

Android Framework: 使用Surface截屏

/** * Takes a screenshot of the current display and shows an animation. */ void takeScreenshot(Runnable finisher, boolean statusBarVisible, boolean navBarVisible) { // We need to orient the screenshot correctly (and the Surface api seems to take screenshots // only in the natural orientation of the device :!) mDisplay.getRealMetrics(mDisplayMetrics); float[] […]