■ ホームボタン (Home Button)
最初の画面に戻れるアレ。/** * publishHomeButtonEvent --- ホームを開く */ private void publishHomeButtonEvent() { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); startActivity(intent); }
■ 最近使ったアプリ (Recent Apps)
起動中のアプリ一覧が出てくるアレ。Android 4.0 以降対応。/** * publishOpenRecentAppsEvent --- 「最近使ったアプリ」を開く * - 参考: http://stackoverflow.com/questions/14267482/android-programmatically-open-recent-apps-dialog */ private void publishOpenRecentAppsEvent() { try { Class<?> serviceManagerClass = Class.forName("android.os.ServiceManager"); Method getService = serviceManagerClass.getMethod("getService", String.class); IBinder retbinder = (IBinder) getService.invoke(serviceManagerClass, "statusbar"); Class<?> statusBarClass = Class.forName(retbinder.getInterfaceDescriptor()); Object statusBarObject = statusBarClass.getClasses()[0].getMethod("asInterface", IBinder.class).invoke(null, new Object[] { retbinder }); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { Method preloadRecentApps = statusBarClass.getMethod("preloadRecentApps"); // 初期化 (しないとアニメーションがおかしくなる) preloadRecentApps.setAccessible(true); preloadRecentApps.invoke(statusBarObject); } Method toggleRecentApps = statusBarClass.getMethod("toggleRecentApps"); toggleRecentApps.setAccessible(true); toggleRecentApps.invoke(statusBarObject); } catch (Exception e) { e.printStackTrace(); } }
■ 通知領域を開く (Notifications)
画面の上端を下向きにスライドすると出てくるアレ。/** * publishExpandNotificationsEvent --- 通知領域を開く * - AndroidManifest.xml に要追加: <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> */ private void publishExpandNotificationsEvent() { try { Object sbservice = getSystemService("statusbar"); Class<?> statusbarManager = Class.forName("android.app.StatusBarManager"); Method expand; if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { // API Level 16 (Android 4.1, 4.1.1) or lower expand = statusbarManager.getMethod("expand"); } else { // API Level 17 (Android 4.2, 4.2.2) or higher expand = statusbarManager.getMethod("expandNotificationsPanel"); } expand.invoke(sbservice); } catch (Exception e) { e.printStackTrace(); } }
使う機会があるのか謎ですが、閉じる場合。(未検証)
/** * publishCollapseNotificationsEvent --- 通知領域を閉じる * - AndroidManifest.xml に要追加: <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> */ private void publishCollapseNotificationsEvent() { try { Object sbservice = getSystemService("statusbar"); Class<?> statusbarManager = Class.forName("android.app.StatusBarManager"); Method collapse; if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { // API Level 16 (Android 4.1, 4.1.1) or lower collapse = statusbarManager.getMethod("collapse"); } else { // API Level 17 (Android 4.2, 4.2.2) or higher collapse = statusbarManager.getMethod("collapsePanels"); } collapse.invoke(sbservice); } catch (Exception e) { e.printStackTrace(); } }
■ 戻るボタン (Back Key)
AccessibilityService を継承し、下の関数を呼べば OK。ただし、Android 4.1 以降のみ。詳しく AccessibilityService について知りたい方は、ググってください。(Bind できないので、なかなか思い通りに動かすのは大変かも。)
performGlobalAction(GLOBAL_ACTION_BACK);
0 件のコメント :
コメントを投稿