以android中Camera应用为例
若设备中存在camera硬件设备,则在launcher中显示camera入口,若不存在则不显示。
1——> packages/apps/Camera/rc/com/android/camera/DisableCameraReceiver.java
每次开机后进行检测
该Receiver用以监听系统完全启动后,检测camera设备数(num>0表示存在)是否存在camera设备,并根据是否存在camera决定加载或者不加载camera应用。主要要注意的方法
private static final String ACTIVITIES[] = { "com.android.camera.CameraLauncher"}; //AndroidManifset.xml中的<category android:name="android.intent.category.LAUNCHER"/> 设置camera在launcher中启动的android:name public void onReceive(Context context, Intent intent) { ..... // Disable this receiver so it won't run again. disableComponent(context, "com.android.camera.DisableCameraReceiver"); //这是取消加载该Receiver,也就是只有第一次启动设备后,以后启动设备,该Receiver组件不会再加载,也就是该组件将不会启动。 每次恢复出厂设置后,重启后都只会启动一次。若camera设备减少,增加或出硬件问题,重启机器后都不会改变。 去掉该段代码,每次开机后都会去检测camera设备数,来决定加载或不加载camera应用,更灵活,但camera设备硬件出问题 后重启机器不会加载camera应用。 }
//不加载控件 private void disableComponent(Context context, String klass) { ComponentName name = new ComponentName(context, klass); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); }
//加载控件 private void enableComponent(Context context, String klass) { ComponentName name = new ComponentName(context, klass); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); }
2——> packages/apps/Gallery2/Androidmanifset.xmlcamera的配置项在Gallery2中,方便二者之间的数据交互。
<activity-alias android:icon="@mipmap/ic_launcher_camera" android:label="@string/camera_label" android:name="com.android.camera.CameraLauncher" android:targetActivity="com.android.camera.Camera" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> //加载在launcher中camera的入口类名。
3——> packages/apps/Gallery2# cd src/com/android/gallery3d/util/GalleryUtils.java设置Gallery中的方法类。其中也包括判断是否存在camera。
private static final String CAMERA_LAUNCHER_NAME = "com.android.camera.CameraLauncher"; public static boolean isCameraAvailable(Context context) { if (sCameraAvailableInitialized) return sCameraAvailable; PackageManager pm = context.getPackageManager(); ComponentName name = new ComponentName(context, CAMERA_LAUNCHER_NAME); int state = pm.getComponentEnabledSetting(name); sCameraAvailableInitialized = true; sCameraAvailable = (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) || (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED); return sCameraAvailable; } //该方法是获取应用中是否存在camera应用。若不存在则在gallery中去除camera的入口。