# Opérations de base sur les applications

Les API relatives aux opérations sur les applications vous permettent de démarrer et d'arrêter facilement des applications, d'accorder ou de révoquer des permissions, de désactiver ou d'activer des applications, ainsi que de rejouer **n'importe quelle** activité système (Activity), y compris les activités non exportées.

## Lister les applications installées

Obtenir les ID de package de toutes les applications installées sur l'appareil.

```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']
```

## Lister les applications en cours d'exécution

Obtenir des informations sur les applications actuellement en cours d'exécution sur le système.

```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
```

## Obtenir une application par son nom

Utiliser le nom commun d'une application pour obtenir son instance (lorsque l'ID de package est inconnu).

```python
# Introduit dans la version 7.75
app = d.get_application_by_name("WeChat")
```

## Obtenir une application par son nom de package

Utiliser l'ID de package d'une application pour obtenir son instance.

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

## Obtenir l'application au premier plan

Obtenir l'instance de l'application actuellement en cours d'exécution au premier plan.

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

## Obtenir une application clonée

Obtenir l'instance d'une application clonée (généralement, les applications clonées sont différenciées par l'utilisateur et ont un UID de 999).

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

## Démarrer une application

Vous pouvez appeler cette API pour démarrer l'application.

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

## Arrêter une application

Vous pouvez appeler cette API pour forcer l'arrêt de cette application.

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

## Vérifier si l'application est au premier plan

Vous pouvez appeler cette API pour vérifier si l'application est actuellement en cours d'exécution au premier plan.

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

## Obtenir les informations de l'application

Vous pouvez appeler cette API pour obtenir des informations sur l'application, telles que sa version.

```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'
```

## Vérifier si l'application est installée

Vous pouvez appeler cette API pour vérifier si cette application est installée sur l'appareil.

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

## Désinstaller une application

Vous pouvez appeler cette API pour désinstaller cette application de l'appareil.

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

## Obtenir les activités récentes

Vous pouvez appeler l'API suivante pour obtenir les 5 dernières activités du système (jusqu'à 12), et vous pouvez également rejouer directement n'importe laquelle de ces activités.

```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}}]
```

## Lancer une activité d'application

Vous pouvez rejouer une Activity au niveau du système, et lancer n'importe quelle Activity de n'importe quelle application. Les paramètres disponibles sont les suivants. Notez que les données supplémentaires (extras) ne prennent en charge que les types boolean, int, short, long, double, float et string.
Pour la définition du paramètre `flags`, veuillez vous référer à la documentation [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)
```

Prenons maintenant l'exemple du retour de l'API `Obtenir les activités récentes`. Vous pouvez directement rejouer la dernière activité système avec le code suivant.

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

Si vous souhaitez lancer une activité dans une application clonée, le code suivant rejouera l'activité dans l'application clonée.

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

Voici quelques exemples pour votre référence. L'appel suivant composera le numéro du service client 10000.

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

L'appel suivant lancera l'application Paramètres, ce qui est presque équivalent à un démarrage direct de l'application.

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

L'appel suivant ouvrira l'application Paramètres en mode débogage. Si vous avez déjà vu `Waitting for debugger`, cela pourrait vous être utile. Bien sûr, votre appareil ou votre application doit être débogable. La seule différence avec l'appel précédent est l'ajout du paramètre `debug`.

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

L'appel suivant vous redirigera directement vers la page des paramètres de certificats.

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


## Lister les permissions de l'application

Cette API peut lister les noms de toutes les permissions déclarées par l'application.

```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']
```

## Accorder une permission à l'application

Cette API est utilisée pour accorder des permissions système à une application. Vous devriez utiliser cette API pour définir les permissions avant que l'application ne soit démarrée. L'utiliser pendant que l'application demande une permission n'aura pas pour effet de cliquer sur "Autoriser" pour vous.

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

Le paramètre `mode` de la méthode `grant` prend également en charge `GrantType.GRANT_DENY`, ce qui signifie refuser explicitement la permission. Il y a aussi `GrantType.GRANT_IGNORE`, dont la signification est assez particulière : il accorde la permission à l'application, mais celle-ci ne peut pas l'utiliser normalement. Par exemple, si une application demande l'accès à la caméra et que vous utilisez ce paramètre pour refuser, la caméra de l'application pourrait afficher un écran noir.

## Révoquer une permission de l'application

L'appel à cette API peut révoquer une permission accordée à l'application. Vous devriez également l'appeler avant de démarrer l'application.

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

## Vérifier si une permission est accordée

Cette API est utilisée pour vérifier si une permission spécifique a été correctement accordée à l'application.

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

## Vider le cache de l'application

Cette API est utilisée pour vider les données de cache de l'application, ce qui n'affecte généralement pas l'application.

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

## Effacer les données de l'application

Cette API est utilisée pour effacer les données de l'application. Attention, cette opération effacera toutes les données de l'application, et les informations telles que les comptes seront perdues.

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

## Obtenir l'activité de lancement

Vous pouvez utiliser cette API pour trouver l'Activity de démarrage de l'application (activité de lancement).

```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']}
```

## Activer une application

Cette API est utilisée pour activer une application désactivée. Après l'activation, vous pourrez à nouveau utiliser l'application normalement.

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

## Désactiver une application

Cette API est utilisée pour désactiver une application. Une application désactivée n'apparaîtra pas dans la liste des applications, et vous ne pourrez pas l'utiliser à moins de la réactiver. Cette fonctionnalité vous permet de geler temporairement ou définitivement une application. L'application ne pourra pas démarrer d'elle-même. Lorsque de nombreuses applications sont installées sur l'appareil, vous pouvez désactiver celles que vous n'utilisez pas temporairement pour réduire l'utilisation des ressources système.

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