# 基本的なアプリ操作

アプリ操作関連のインターフェースを使用すると、アプリの起動と終了、権限の付与と取り消し、アプリの有効化と無効化、そしてエクスポートされていないアクティビティを含む**任意**のシステムアクティビティ（Activity）のリプレイなどを簡単に行うことができます。

## インストール済みアプリの一覧表示

デバイスにインストールされているすべてのアプリの package ID を取得します。

```python
d.enumerate_all_pkg_names()
```

```python
>>> d.enumerate_all_pkg_names()
['com.android.calendar', 'com.android.camera2', 'com.android.contacts', 'com.android.deskclock', 'com.android.dialer', 'com.android.gallery3d', 'com.android.messaging', 'com.android.settings', 'com.android.vending', 'com.android.documentsui', 'com.android.quicksearchbox', 'com.google.android.googlequicksearchbox']
```

## 実行中のアプリの一覧表示

システムで現在実行中のアプリに関する情報を取得します。

```python
d.enumerate_running_processes()
```

```python
>>> d.enumerate_running_processes()
[packages: "com.android.launcher3"
processName: "com.android.launcher3"
uid: 10101
pid: 2333
, packages: "com.google.android.gms"
processName: "com.google.android.gms.persistent"
uid: 10075
pid: 2702
...
```

```python
>>> result = d.enumerate_running_processes()
>>> print (result[0].processName)
com.android.launcher3
```

## 名前によるアプリの取得

アプリの一般名を使用してアプリのインスタンスを取得します（Package IDが不明な場合）。

```python
# バージョン7.75で導入
app = d.get_application_by_name("微信")
```

## パッケージ名によるアプリの取得

アプリの Package ID を使用してアプリのインスタンスを取得します。

```python
app = d.application("com.tencent.mm")
```

## フォアグラウンドアプリの取得

現在フォアグラウンドで実行中のアプリのインスタンスを取得します。

```python
app = d.current_application()
```

## クローンアプリの取得

クローンアプリのインスタンスを取得します（通常、クローンアプリは user で区別され、UIDは999です）。

```python
app = d.application("com.my.app", user=999)
```

## アプリの起動

このインターフェースを呼び出してアプリを起動できます。

```python
app.start()
```

## アプリの終了

このインターフェースを呼び出してアプリを強制終了できます。

```python
app.stop()
```

## フォアグラウンド実行の確認

このインターフェースを呼び出して、アプリが現在フォアグラウンドで実行中かどうかを確認できます。

```python
app.is_foreground()
```

## アプリ情報の取得

このインターフェースを呼び出して、バージョンなどのアプリ関連情報を取得できます。

```python
app.info()
```

```python
>>> app.info()
packageName: "com.android.settings"
uid: 1000
enabled: true
processName: "com.android.settings"
sourceDir: "/system/product/priv-app/Settings/Settings.apk"
dataDir: "/data/user_de/0/com.android.settings"
firstInstallTime: 1230739200000
lastUpdateTime: 1230768000000
versionCode: 1276
versionName: "10"
```

```python
>>> result = app.info()
>>> print (result.processName)
'com.android.settings'
```

## インストール状態の確認

このインターフェースを呼び出して、このアプリがデバイスにインストールされているかどうかを確認できます。

```python
app.is_installed()
```

## アプリのアンインストール

このインターフェースを呼び出して、デバイスからこのアプリをアンインストールできます。

```python
app.uninstall()
```

## 最近のアクティビティの取得

以下のインターフェースを呼び出して、システム内の最近5件のアクティビティ（最大12件）を取得できます。また、任意のアクティビティを直接リプレイすることもできます。

```python
activities = d.get_last_activities(count=5)
```

```python
>>> d.get_last_activities(count=5)
[{'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}]
```

## アプリアクティビティの開始

システムレベルの Activity をリプレイでき、任意のアプリの任意のアクティビティを呼び出すことができます。利用可能なパラメータは以下の通りです。付加データ（extras）は boolean、int、short、long、double、float、および string 型のみをサポートすることに注意してください。
flags パラメータの定義については、ドキュメント [developer.android.com/reference/android/content/Intent](https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_BROUGHT_TO_FRONT) を参照してください。

```python
from lamda.const import *
d.start_activity(action="*", category="*", component="*", extras={"boolean": False, "int": 1, "string": "abc", "float": 1.123}, flags=FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK, data="*", debug=False)
```

では、`最近のアクティビティの取得`インターフェースの戻り値を例に、以下のコードで最後のシステム Activity を直接リプレイできます。

```python
activity = d.get_last_activities(count=5)[-1]
d.start_activity(**activity)
```

クローンアプリを呼び出す場合は、以下のコードで Activity をクローンアプリにリプレイします。

```python
d.start_activity(**activity, user=999)
```

以下に参考用の例をいくつか示します。次の呼び出しは、カスタマーサービスの電話番号10000に発信します。

```python
d.start_activity(action="android.intent.action.CALL", data="tel:10000")
```

次の呼び出しは、設定アプリを起動します。これはアプリを直接起動するのとほぼ同等です。

```python
d.start_activity(action="android.intent.action.MAIN", category="android.intent.category.LAUNCHER", component="com.android.settings/.Settings")
```

次の呼び出しは、設定アプリをデバッグモードで開きます。`Waitting for debugger` という表示を見たことがあるなら、これは役立つかもしれません。もちろん、デバイスまたはアプリがデバッグ可能である必要があります。上記の呼び出しとの違いは、`debug` パラメータが追加されている点だけです。

```python
d.start_activity(action="android.intent.action.MAIN", category="android.intent.category.LAUNCHER", component="com.android.settings/.Settings", debug=True)
```

次の呼び出しは、証明書設定ページに直接ジャンプします。

```python
d.start_activity(action="com.android.settings.TRUSTED_CREDENTIALS")
```


## アプリ権限の一覧表示

このインターフェースは、アプリが宣言しているすべての権限名を一覧表示できます。

```python
app.permissions()
```

```python
>>> app.permissions( )
['android.permission.REQUEST_NETWORK_SCORES', 'android.permission.WRITE_MEDIA_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE', 'android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_SETTINGS', 'android.permission.WRITE_SECURE_SETTINGS', 'android.permission.DEVICE_POWER', 'android.permission.CHANGE_CONFIGURATION', 'android.permission.MOUNT_UNMOUNT_FILESYSTEMS', 'android.permission.VIBRATE', 'android.permission.BLUETOOTH', 'android.permission.BLUETOOTH_ADMIN', 'android.permission.BLUETOOTH_PRIVILEGED', 'android.permission.ACCESS_COARSE_LOCATION', 'android.permission.NFC', 'android.permission.HARDWARE_TEST', 'android.permission.CALL_PHONE', 'android.permission.MODIFY_AUDIO_SETTINGS', 'android.permission.MASTER_CLEAR', 'com.google.android.googleapps.permission.GOOGLE_AUTH', 'android.permission.ACCESS_DOWNLOAD_MANAGER', 'android.permission.READ_CONTACTS', 'android.permission.WRITE_CONTACTS', 'android.permission.ACCESS_NETWORK_STATE', 'android.permission.LOCAL_MAC_ADDRESS', 'android.permission.ACCESS_WIMAX_STATE', 'android.permission.CHANGE_WIMAX_STATE', 'android.permission.ACCESS_WIFI_STATE', 'com.android.certinstaller.INSTALL_AS_USER', 'android.permission.CHANGE_WIFI_STATE', 'android.permission.TETHER_PRIVILEGED', 'android.permission.FOREGROUND_SERVICE', 'android.permission.INTERNET', 'android.permission.CLEAR_APP_USER_DATA', 'android.permission.READ_PHONE_STATE', 'android.permission.MODIFY_PHONE_STATE', 'android.permission.ACCESS_FINE_LOCATION', 'android.permission.WRITE_APN_SETTINGS', 'android.permission.ACCESS_CHECKIN_PROPERTIES', 'android.permission.READ_USER_DICTIONARY', 'android.permission.WRITE_USER_DICTIONARY', 'android.permission.FORCE_STOP_PACKAGES', 'android.permission.PACKAGE_USAGE_STATS', 'android.permission.BATTERY_STATS', 'com.android.launcher.permission.READ_SETTINGS', 'com.android.launcher.permission.WRITE_SETTINGS', 'android.permission.MOVE_PACKAGE', 'android.permission.USE_CREDENTIALS', 'android.permission.BACKUP', 'android.permission.READ_SYNC_STATS', 'android.permission.READ_SYNC_SETTINGS', 'android.permission.WRITE_SYNC_SETTINGS', 'android.permission.READ_DEVICE_CONFIG', 'android.permission.STATUS_BAR', 'android.permission.MANAGE_USB', 'android.permission.MANAGE_DEBUGGING', 'android.permission.SET_POINTER_SPEED', 'android.permission.SET_KEYBOARD_LAYOUT', 'android.permission.INTERACT_ACROSS_USERS_FULL', 'android.permission.COPY_PROTECTED_DATA', 'android.permission.MANAGE_USERS', 'android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS', 'android.permission.READ_PROFILE', 'android.permission.CONFIGURE_WIFI_DISPLAY', 'android.permission.CONFIGURE_DISPLAY_COLOR_MODE', 'android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS', 'android.permission.SET_TIME', 'android.permission.ACCESS_NOTIFICATIONS', 'android.permission.REBOOT', 'android.permission.RECEIVE_BOOT_COMPLETED', 'android.permission.MANAGE_DEVICE_ADMINS', 'android.permission.READ_SEARCH_INDEXABLES', 'android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE', 'android.permission.OEM_UNLOCK_STATE', 'android.permission.MANAGE_USER_OEM_UNLOCK_STATE', 'android.permission.OVERRIDE_WIFI_CONFIG', 'android.permission.USE_FINGERPRINT', 'android.permission.MANAGE_FINGERPRINT', 'android.permission.USE_BIOMETRIC', 'android.permission.USE_BIOMETRIC_INTERNAL', 'android.permission.USER_ACTIVITY', 'android.permission.CHANGE_APP_IDLE_STATE', 'android.permission.PEERS_MAC_ADDRESS', 'android.permission.MANAGE_NOTIFICATIONS', 'android.permission.DELETE_PACKAGES', 'android.permission.REQUEST_DELETE_PACKAGES', 'android.permission.MANAGE_APP_OPS_RESTRICTIONS', 'android.permission.MANAGE_APP_OPS_MODES', 'android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS', 'android.permission.READ_PRINT_SERVICES', 'android.permission.NETWORK_SETTINGS', 'android.permission.TEST_BLACKLISTED_PASSWORD', 'android.permission.USE_RESERVED_DISK', 'android.permission.MANAGE_SCOPED_ACCESS_DIRECTORY_PERMISSIONS', 'android.permission.CAMERA', 'android.permission.MEDIA_CONTENT_CONTROL', 'com.wapi.permission.ACCESS_CERTIFICATE', 'com.oneplus.faceunlock.permission.FACE_SETTING', 'android.permission.STATUS_BAR_SERVICE', 'android.permission.MODIFY_AUDIO_ROUTING', 'com.oneplus.account.READ_ACCOUNT_INFO', 'com.android.settings.SEND_PERMISSION']
```

## アプリ権限の付与

このインターフェースは、アプリに対応するシステム権限を付与するために使用されます。このインターフェースはアプリが起動していない時に権限設定を行うべきです。アプリ実行中に権限を要求された際に使用しても、「許可」をクリックする効果はありません。

```python
from lamda.const import *
app.grant(PERMISSION_READ_PHONE_STATE, mode=GrantType.GRANT_ALLOW)
```

grant メソッドの mode パラメータは、`GrantType.GRANT_DENY`（権限を明示的に拒否する）もサポートしています。また、`GrantType.GRANT_IGNORE` もあります。`GRANT_IGNORE` の意味は特殊で、アプリに権限を付与しますが、実際にはアプリはその権限を正常に使用できません。例えば、アプリがカメラを要求した場合にこのパラメータで拒否すると、アプリのカメラがブラックアウトすることがあります。

## アプリ権限の取り消し

このインターフェースを呼び出すと、アプリに付与された権限を取り消すことができます。これも同様に、アプリを起動する前に呼び出すべきです。

```python
from lamda.const import *
app.revoke(PERMISSION_READ_PHONE_STATE)
```

## 付与状態の確認

このインターフェースは、特定の権限がアプリに正常に付与されているかどうかを確認するために使用されます。

```python
from lamda.const import *
app.is_permission_granted(PERMISSION_READ_PHONE_STATE)
```

## アプリキャッシュのクリア

このインターフェースは、アプリのキャッシュデータをクリアするために使用されます。通常、アプリに影響はありません。

```python
app.clear_cache()
```

## アプリデータのクリア

このインターフェースは、アプリのデータをクリアするために使用されます。注意：この操作はアプリのすべてのデータを消去し、アカウント情報などが失われます。

```python
app.reset()
```

## エントリーアクティビティの取得

このインターフェースを通じて、アプリの起動 Activity（エントリーアクティビティ）を照会できます。

```python
app.query_launch_activity()
```

```python
>>> app.query_launch_activity()
{'action': 'android.intent.action.MAIN', 'component': 'com.android.settings/com.android.settings.Settings', 'categories': ['android.intent.category.LAUNCHER']}
```

## アプリの有効化

このインターフェースは、無効化されたアプリを有効化するために使用されます。有効化後、アプリは通常通り使用できます。

```python
app.enable()
```

## アプリの無効化

このインターフェースは、アプリを無効化するために使用されます。無効化されたアプリはアプリ一覧に表示されなくなり、有効化されるまで使用できません。この機能により、アプリを一時的または完全に凍結できます。無効化されたアプリは自動起動できず、デバイスに多くのアプリがインストールされている場合に、一時的に不要なアプリを無効化することでシステムリソースの使用を削減できます。

```python
app.disable()
```