应用相关操作¶
应用操作相关的接口可以让您方便的启动关闭应用,以及授予或者撤销应用的权限,禁用或者启用应用,以及重放任意系统活动(Activity)包括任意未导出的活动等功能。
列出安装的应用¶
获取设备上所有已安装应用的 package ID。
d.enumerate_all_pkg_names()
>>> 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']
列出运行的应用¶
获取系统上当前正在运行的应用相关信息。
d.enumerate_running_processes()
>>> 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
...
>>> result = d.enumerate_running_processes()
>>> print (result[0].processName)
com.android.launcher3
通过名称获取应用¶
使用应用的常用名来获取应用实例(不清楚 Package ID)。
# 7.75 版本引入
app = d.get_application_by_name("微信")
通过包名获取应用¶
使用应用的 Package ID 来获取应用实例。
app = d.application("com.tencent.mm")
获取前台应用¶
获取当前正在前台运行的应用实例。
app = d.current_application()
获取多开应用¶
获取多开应用的实例(通常情况下,多开应用通过 user 区分并且UID为999)。
app = d.application("com.my.app", user=999)
启动应用¶
您可以调用此接口来启动 APP。
app.start()
关闭应用¶
您可以调用此接口来强制关闭此 app。
app.stop()
检查前台运行¶
您可以调用此接口来检查应用当前是否正在前台运行。
app.is_foreground()
获取应用信息¶
您可以调用此接口获取应用的相关信息如版本等。
app.info()
>>> 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"
>>> result = app.info()
>>> print (result.processName)
'com.android.settings'
检查是否安装¶
您可以调用此接口来检查此应用是否已经安装在设备上。
app.is_installed()
卸载应用¶
您可以调用此接口来从设备上卸载该应用。
app.uninstall()
获取最近活动¶
您可以调用以下接口获取系统中最近的5条活动(最多12条),您也可以直接重放任意一条活动。
activities = d.get_last_activities(count=5)
>>> 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,可以调起任意应用的任意 Activity。他的可用参数如下,您需要注意,附加数据(extras)只支持 boolean, int, short, long, double, float 以及 string 类型。 flags 参数的定义请参考文档 developer.android.com/reference/android/content/Intent。
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。
activity = d.get_last_activities(count=5)[-1]
d.start_activity(**activity)
如果您是要调起多开应用,如下代码会将 Activity 重放至多开应用。
d.start_activity(**activity, user=999)
下面给您一些示例供您参考,以下调用会拨打 10000 客服电话。
d.start_activity(action="android.intent.action.CALL", data="tel:10000")
以下调用,会为您启动 Settings 应用,这几乎等价于直接启动应用。
d.start_activity(action="android.intent.action.MAIN", category="android.intent.category.LAUNCHER", component="com.android.settings/.Settings")
以下调用,会以调试模式打开设置应用,如果您见过 Waitting for debugger
,那么它可能对您有用。当然,您的设备或者APP需要是可调试的,他和上面的调用区别仅仅多了一个 debug
参数。
d.start_activity(action="android.intent.action.MAIN", category="android.intent.category.LAUNCHER", component="com.android.settings/.Settings", debug=True)
以下调用,会为您直接跳转进入证书设置页面。
d.start_activity(action="com.android.settings.TRUSTED_CREDENTIALS")
列出应用权限¶
此接口可以列出应用所有声明的权限名称。
app.permissions()
>>> 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']
授予应用权限¶
此接口用于授予应用对应的系统权限,您应在 APP 未启动时使用此接口进行权限设置,在 APP 运行请求权限时使用并不会产生帮您点击允许的效果。
from lamda.const import *
app.grant(PERMISSION_READ_PHONE_STATE, mode=GrantType.GRANT_ALLOW)
其中 grant 方法的 mode 参数,还支持 GrantType.GRANT_DENY
,意思为明确拒绝该权限。以及 GrantType.GRANT_IGNORE
,GRANT_IGNORE
的意义较为特殊,其代表授予应用该权限,但是应用实际无法正常使用此权限,比如如果应用请求相机,使用此参数拒绝,应用的相机可能黑屏。
撤销应用权限¶
调用此接口可以撤销授予应用的权限,您同样应该在应用启动前进行调用。
from lamda.const import *
app.revoke(PERMISSION_READ_PHONE_STATE)
检查是否授予¶
此接口用于检查某项权限是否已经正常授予应用。
from lamda.const import *
app.is_permission_granted(PERMISSION_READ_PHONE_STATE)
清除应用缓存¶
此接口用于清除应用的缓存数据,通常不会对应用造成影响。
app.clear_cache()
清除应用数据¶
此接口用于清除应用的数据,注意此操作会清空应用所有数据,应用的信息如账号等将会丢失。
app.reset()
获取入口活动¶
您可以通过此接口查询该应用的启动 Activity(入口活动)。
app.query_launch_activity()
>>> app.query_launch_activity()
{'action': 'android.intent.action.MAIN', 'component': 'com.android.settings/com.android.settings.Settings', 'categories': ['android.intent.category.LAUNCHER']}
启用应用¶
此接口用于启用被禁用的应用,启用后您仍然可以正常使用应用。
app.enable()
禁用应用¶
此接口用于禁用应用,被禁用的应用将不会在应用列表中显示,您也无法使用除非被启用。该功能可为您临时或彻底的冻结应用,该应用无法自启动,在设备上的应用安装较多时您可以适当禁用暂时不需要使用的 APP 以减少系统资源的使用。
app.disable()