App API
Описание
IDroidAppAPI предназначен для управления приложениями на Android-устройстве в ZennoDroid. Предоставляет методы для работы с данными приложений, аккаунтами, уведомлениями, cookies и состоянием приложений.
Большинство методов принимают параметр packageName — имя пакета приложения. Для поиска нужного имени используйте инструмент Установленные приложения.
Повторяет логику работы кубика Действия с приложением для версий Lite/Pro и Enterprise.
Свойства
Top
-
string Top { get; }
Текущее активное приложение.Возвращает:
Имя пакета приложения на переднем плане.
TopPid
-
uint TopPid { get; }
PID текущего приложения.Возвращает:
Идентификатор процесса.
Пример.
var app = instance.DroidInstance.App;
string top = app.Top;
uint TopPid = app.TopPid;
Методы
AddAccount
-
bool AddAccount(string name, string type, string password)
Добавляет аккаунт на устройство.Параметры:
name— имя аккаунта (например, email или логин);type— тип аккаунта (например:com.google,com.facebook.auth.login);password— пароль аккаунта в зашифрованном виде, каким его возвращает GetAccounts. В открытом виде пароль не принимается. Пустая строка иnullравнозначны: пароль не задаётся.
Возвращает:
true, если аккаунт успешно добавлен; иначеfalse. -
bool AddAccount(string name, string type, string password, string metadata)
Добавляет аккаунт с дополнительными метаданными.Параметры:
name— имя аккаунта;type— тип аккаунта;password— пароль аккаунта в зашифрованном виде, каким его возвращает GetAccounts;metadata— дополнительные данные аккаунта в том виде, в котором их вернул GetAccounts: именно с ними аккаунт переносится на другое устройство вместе с авторизацией. Произвольный текст или свой JSON здесь не подойдут.
Возвращает:
true, если аккаунт успешно добавлен; иначеfalse.
Пример.
var app = instance.DroidInstance.App;
// Забираем аккаунт с одного устройства
var json = app.GetAccounts("com.android.chrome");
project.Json.FromString(json);
var name = project.Json[0].name;
var type = project.Json[0].type;
var password = project.Json[0].password;
var metadata = project.Json[0].metadata;
// И добавляем на другом
app.AddAccount(name, type, password); // Только аккаунт
app.AddAccount(name, type, password, metadata); // Вместе с авторизацией
AppDir
-
string AppDir(string packageName)
Возвращает путь к директории приложения на устройстве.Параметры:
packageName— имя пакета приложения (например:com.android.chrome).
Пример.
var app = instance.DroidInstance.App;
var dir = app.AppDir("com.android.chrome"); // Каталог приложения на устройстве
project.SendInfoToLog(dir);
BackupAppData
-
void BackupAppData(string packageName, string pathToBackup)
Создаёт резервную копию данных приложения.Параметры:
packageName— имя пакета приложения;pathToBackup— путь для сохранения бэкапа.
-
void BackupAppData(string packageName, string pathToBackup, bool savePermissions)
Создаёт резервную копию с возможностью сохранения разрешений приложения.Параметры:
savePermissions— сохранять ли текущие разрешения приложения.
-
void BackupAppData(string packageName, string pathToBackup, bool savePermissions, string accountType)
Расширенное резервное копирование с учётом типа аккаунта.Параметры:
savePermissions— сохранять разрешения;accountType— тип аккаунта (например:com.yandex.passport,com.twitter.android.auth.login). Тип аккаунта можно узнать с помощью методаGetAccounts(string packageName).
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var pathSave = @"/dir/bakups/name_bakup"; // Путь куда сохранить бэкап
app.BackupAppData(packageName, pathSave); // Сделать бэкап
Clean
-
void Clean(string packageName)
Полностью очищает данные приложения (возвращает в состояние после установки).Параметры:
packageName— имя пакета.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
app.Clean(packageName); // Очистить данные приложения
CleanCache
-
void CleanCache(string packageName)
Очищает только кэш приложения.Параметры:
packageName— имя пакета.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
app.CleanCache(packageName); // Очистить кэш приложения
ClearAllNotifications
void ClearAllNotifications()
Очищает все уведомления устройства.
Пример.
var app = instance.DroidInstance.App;
app.ClearAllNotifications(); // Очистить все уведомления
ClearAppNotifications
-
void ClearAppNotifications(string packageName)
Очищает уведомления конкретного приложения.Параметры:
packageName— имя пакета.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
app.ClearAppNotifications(packageName); // Очистить уведомления приложения
Close
-
void Close(string packageName)
Закрывает приложение.Параметры:
packageName— имя пакета.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
app.Close(packageName); // Закрыть приложение
CloseAll
void CloseAll()
Закрывает все приложения.
Пример.
var app = instance.DroidInstance.App;
app.CloseAll(); // Закрыть все приложения
DataDir
-
string DataDir(string packageName)
Возвращает директорию данных приложения.Параметры:
packageName— имя пакета.
Возвращает:
Путь к каталогу данных (обычно/data/data/...).
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var directory = app.DataDir(packageName); // Получить директорию хранения данных приложения.
Delete
-
void Delete(string packageName)
Удаляет приложение с устройства.Параметры:
packageName— имя пакета.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
app.Delete(packageName); // Удалить приложение
DeleteCookie
-
string DeleteCookie(string packageName, string host = null, string name = null, bool persistentOnly = false, bool secureOnly = false, bool httpOnly = false)
Удаляет cookies из Chromium-хранилища приложения. Фильтры совпадают с фильтрамиGetCookieи применяются на устройстве.Параметры:
packageName— имя пакета;host— фильтр по домену: удаляются cookies этого домена и его поддоменов, несколько доменов указываются через запятую. Пустое значение — любой домен;name— фильтр по имени cookie (точное совпадение), несколько имён указываются через запятую. Пустое значение — любое имя;persistentOnly— удалять только постоянные cookies, не трогая сессионные;secureOnly— удалять только cookies с флагомSecure;httpOnly— удалять только cookies с флагомHttpOnly.
Возвращает:
JSON-отчёт об удалении: сколько cookies проверено и удалено по каждой базе.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
// Удалить одну куку домена example.com и его поддоменов
var report = app.DeleteCookie(packageName, "example.com", "sid");
project.Json.FromString(report);
// Полная очистка хранилища куки приложения
app.DeleteCookie(packageName);
- Вызов без фильтров удаляет все cookies приложения.
- Нужен root: при удалении приложение принудительно останавливается, а запись идёт в его каталог данных.
- Если приложение ещё ни разу не запускалось, хранилище cookies не создано и метод вернёт пустую строку.
GetAccounts
-
string GetAccounts(string packageName)
Получает список аккаунтов приложения в формате JSON.Параметры:
packageName— имя пакета.
Возвращает:
JSON-массив аккаунтов: у каждогоname,type,passwordиmetadata. Пароль и метаданные возвращаются в зашифрованном виде - в нём же их принимаетAddAccount. Если аккаунтов нет - пустую строку. -
string GetAccounts(string packageName, string type)
Получает аккаунты определённого типа.Параметры:
packageName— имя пакета;type— тип аккаунта (например:com.google).
Возвращает:
JSON-массив аккаунтов заданного типа в том же виде. Если таких аккаунтов нет - пустую строку.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var json = app.GetAccounts(packageName); // Получить аккаунты приложения
GetAllNotifications
-
string GetAllNotifications()
Получает все уведомления устройства в формате JSON.Возвращает:
Строку с информацией об уведомлениях.
Пример.
var app = instance.DroidInstance.App;
var json = app.GetAllNotifications(); // Получить все уведомления
project.Json.FromString(json); // Обработать Json
GetApplicationsInfo
-
string GetApplicationsInfo()
Возвращает подробную информацию обо всех установленных приложениях в формате JSON.Возвращает:
Строку JSON с данными о приложениях: имя пакета, Activity для запуска, отображаемое имя, версия, а также признак системного приложения.
Пример.
var app = instance.DroidInstance.App;
var json = app.GetApplicationsInfo(); // Получить подробную информацию обо всех приложениях
project.Json.FromString(json); // Обработать Json
GetAppNotifications
-
string GetAppNotifications(string packageName)
Получает уведомления конкретного приложения в формате JSON.Параметры:
packageName— имя пакета.
Возвращает:
Строку с уведомлениями.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var json = app.GetAppNotifications(packageName); // Получить все уведомления
project.Json.FromString(json); // Обработать Json
GetCookie
-
string GetCookie(string packageName)
Получает cookies приложения.Параметры:
packageName— имя пакета.
Возвращает:
Строку с cookies. -
string GetCookie(string packageName, string host, string name = null, bool persistentOnly = false, bool secureOnly = false, bool httpOnly = false)
Получает cookies приложения с фильтрацией. Фильтры применяются на устройстве до расшифровки значений, поэтому вариант удобен для больших хранилищ.Параметры:
packageName— имя пакета;host— фильтр по домену: берутся cookies этого домена и его поддоменов, несколько доменов указываются через запятую. Пустое значение — любой домен;name— фильтр по имени cookie (точное совпадение), несколько имён указываются через запятую. Пустое значение — любое имя;persistentOnly— исключить сессионные cookies;secureOnly— оставить только cookies с флагомSecure;httpOnly— оставить только cookies с флагомHttpOnly.
Возвращает:
Строку с cookies в том же формате, что иGetCookie(packageName).
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var cookies = app.GetCookie(packageName); // Получить куки приложения
// Только постоянные Secure-куки домена example.com и его поддоменов
var filtered = app.GetCookie(packageName, "example.com", null, true, true);
GetCookiePath
-
string GetCookiePath(string packageName)
Возвращает путь к cookies приложения.Параметры:
packageName— имя пакета.
Возвращает:
Путь к файлу cookies.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var pathCookie = app.GetCookiePath(packageName); // Получить путь хранения куки
GetLaunchableApplicationsInfo
-
string GetLaunchableApplicationsInfo()
Возвращает подробную информацию в формате JSON только о приложениях, которые можно запустить (то есть имеющих activity для запуска). Набор полей такой же, как уGetApplicationsInfo.Возвращает:
Строку JSON с данными о запускаемых приложениях: имя пакета, Activity для запуска, отображаемое имя, версия, а также признак системного приложения.
Пример.
var app = instance.DroidInstance.App;
var json = app.GetLaunchableApplicationsInfo(); // Получить информацию только о запускаемых приложениях
project.Json.FromString(json); // Обработать Json
GetListPackages
-
string[] GetListPackages()
Возвращает список всех пакетов на устройстве.Возвращает:
Массив имён пакетов.
Пример.
var app = instance.DroidInstance.App;
var packages = app.GetListPackages(); // Получить массив всех установленных приложений
GetListSystemPackages
-
string[] GetListSystemPackages()
Возвращает список системных приложений.Возвращает:
Массив пакетов.
Пример.
var app = instance.DroidInstance.App;
var packages = app.GetListSystemPackages(); // Получить массив всех системных приложений
GetListUserPackages
-
string[] GetListUserPackages()
Возвращает список пользовательских приложений.Возвращает:
Массив пакетов.
Пример.
var app = instance.DroidInstance.App;
var packages = app.GetListUserPackages(); // Получить массив всех пользовательских приложений
ImportCookie
-
string ImportCookie(string packageName, string cookies, bool replaceAll = false)
Импортирует cookies в Chromium-хранилище приложения. Значения шифруются на устройстве по той же схеме, которую использует само приложение.Параметры:
packageName— имя пакета;cookies— cookies в виде JSON-массива в формате ZennoLab (такой же, какой возвращаетGetCookie);replaceAll—true— очистить хранилище перед импортом,false— дописать cookies и обновить существующие.
Возвращает:
JSON-отчёт об импорте: сколько cookies добавлено, заменено, пропущено и не удалось записать по каждой базе.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var cookies = @"[{
""domain"": "".example.com"",
""name"": ""sid"",
""value"": ""abc123"",
""path"": ""/"",
""expirationDate"": 1790000000,
""httpOnly"": true,
""secure"": true,
""sameSite"": ""Lax"",
""is_persistent"": true
}]"; // Куки в формате ZennoLab
var report = app.ImportCookie(packageName, cookies); // Дописать куки в хранилище приложения
project.Json.FromString(report);
- Нужен root: при импорте приложение принудительно останавливается, а запись выполняется от его имени.
- Приложение должно быть запущено хотя бы один раз, иначе хранилище cookies ещё не создано и метод вернёт ошибку.
InjectScript
-
void InjectScript(string packageName, string script)
Внедряет JavaScript-скрипт в приложение, который выполняется перед загрузкой страницы.Параметры:
packageName— имя пакета;script— код скрипта.
Пример.
var app = "com.android.chrome";
var script = project.Variables["script"].Value;
instance.DroidInstance.App.Close(app); // Закрыть приложение
var lspHelper = new LSPosedHelper(instance.DroidInstance);
lspHelper.SetPackages(app); // Задать приложение в списке подмены модуля ZennoDroid
lspHelper.EnableModule(); // Включить модуль ZennoDroid
instance.DroidInstance.Settings.SetLSPosedSettings("{ \"UseInjectScript\":true }"); // Включить возможность выполнять javascript перед загрузкой страницы
instance.DroidInstance.App.InjectScript(app, script); // Задать скрипт, который будет выполняться перед загрузкой
instance.DroidInstance.App.Open(app); // Отрыть приложение
Переменная проекта script содержит код, который нужно выполнить.
(() => {
const ID = "hello-world-date-banner";
const existing = document.getElementById(ID);
const text = `Hello world — ${new Date().toLocaleString()}`;
if (existing) {
existing.textContent = text; // already added: just update
return;
}
const el = document.createElement("div");
el.id = ID;
el.textContent = text;
el.style.cssText =
"padding:8px 12px;background:#fffbcc;color:#111;" +
"font:14px/1.4 system-ui;border-bottom:1px solid #e6d98c;";
(document.body || document.documentElement).prepend(el);
})();
InstallApk
-
void InstallApk(string path)
Устанавливает APK-файл.Параметры:
path— путь к APK.
-
void InstallApk(string path, bool useCache, bool useRoot)
Устанавливает APK с дополнительными параметрами.Параметры:
path— путь к APK;useCache— использовать кэш при установке;useRoot— использовать root-доступ.
Пример.
var app = instance.DroidInstance.App;
var pathApk = @"\chrome.apk"; // Путь приложения
app.InstallApk(pathApk); // Установить приложение
IsInstalled
-
bool IsInstalled(string packageName)
Проверяет, установлено ли приложение.Параметры:
packageName— имя пакета.
Возвращает:
true, если установлено; иначеfalse.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var isApk = app.IsInstalled(packageName); // Проверка установлено ли приложение
if (!isApk) // Если нет, то установим
{
var pathApk = @"\chrome.apk"; // Путь приложения
app.InstallApk(pathApk); // Установить приложение
}
Open
-
void Open(string packageName)
Запускает приложение.Параметры:
packageName— имя пакета.
-
void Open(string packageName, string activityName)
Запускает приложение с указанием Activity.Параметры:
packageName— пакет;activityName— Activity.
-
void Open(string packageName, string activityName, string action)
Запускает приложение с указанием Activity и Intent Action.Параметры:
packageName— имя пакета;activityName— имя Activity;action— действие Intent (например:android.intent.action.VIEW).
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
app.Open(packageName); // Запустить приложение
app.Open(packageName, "com.google.android.apps.chrome.Main"); // Открыть конкретную Activity
app.Open(packageName, "com.google.android.apps.chrome.Main", "android.intent.action.VIEW"); // С действием Intent
OpenAsRoot
-
void OpenAsRoot(string packageName, string activityName)
Запускает приложение с правами root с указанием Activity.Параметры:
packageName— имя пакета;activityName— имя Activity.
-
void OpenAsRoot(string packageName, string activityName, string action)
Запускает приложение с правами root с указанием Activity и Intent Action.Параметры:
packageName— имя пакета;activityName— имя Activity;action— действие Intent (например:android.intent.action.VIEW).
Пример.
//#1
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
app.Open(packageName); // Открыть приложение
//#2
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var activity = ".MainActivity"; // Активити хрома.(Не рабочий пример!)
app.Open(packageName, activity); // Открыть приложение
OpenUrl
-
void OpenUrl(string url)
Открывает URL.Параметры:
url— ссылка.
-
void OpenUrl(string url, string packageName)
Открывает URL через конкретное приложение.Параметры:
url— ссылка;packageName— приложение.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var url = "http://ya.ru";
app.OpenUrl(url, packageName); // Открыть Chrome и зайти на сайт ya.ru
PatchFlutterLib
-
void PatchFlutterLib(string packageName, string proxy)
Выполняет патч библиотеки Flutter (libflutter.so) для указанного приложения с целью перенаправления сетевого трафика в BurpSuite для дальнейшего анализа.Параметры:
packageName— имя пакета приложения;proxy— адрес прокси (например:10.0.2.2:8083).
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.app.flutter"; // Имя приложения на Flutter
app.PatchFlutterLib(packageName, "10.0.2.2:8083"); // Направить трафик приложения в BurpSuite
app.Open(packageName);
RemoveAccount
-
bool RemoveAccount(string name, string type)
Удаляет аккаунт.Параметры:
name— имя аккаунта;type— тип аккаунта.
Возвращает:
true, если успешно удалён.
Например, у приложений Яндекс Go, Яндекс Почта и Яндекс Музыка общая система авторизации. Поэтому при удалении одного из приложений у двух других всё равно останется доступ к аккаунту.
В таких случаях нужно достать аккаунты из приложения и принудительно их удалить.
Пример.
var app = instance.DroidInstance.App;
app.RemoveAccount("mymail@gmail.com", "com.google"); // Удалить аккаунт с устройства
ResetFakeCameraFraming
-
void ResetFakeCameraFraming(string packageName)
Возвращает кадрирование к значениям по умолчанию: видео заполняет кадр от середины, без поворота и приближения.Параметры:
packageName— имя пакета приложения.
Пример.
var app = instance.DroidInstance.App;
app.ResetFakeCameraFraming("com.android.camera2"); // Вернуть кадрирование по умолчанию
RestoreAppData
-
void RestoreAppData(string packageName, string pathToBackup)
Восстанавливает данные приложения из резервной копии.Параметры:
packageName— имя пакета приложения;pathToBackup— путь к резервной копии.
-
void RestoreAppData(string packageName, string pathToBackup, bool restorePermissions)
Восстанавливает данные с возможностью восстановления разрешений.Параметры:
restorePermissions— восстанавливать ли разрешения приложения.
-
void RestoreAppData(string packageName, string pathToBackup, bool restorePermissions, bool restoreAccount)
Расширенное восстановление с возможностью восстановления аккаунта.Параметры:
restorePermissions— восстанавливать разрешения;restoreAccount— восстанавливать связанные аккаунты.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var pathSave = @"/dir/bakups/name_bakup"; // Путь к бэкапу
app.RestoreAppData(packageName, pathSave); // Восстановить данные
app.RestoreAppData(packageName, pathSave, true); // Вместе с разрешениями
app.RestoreAppData(packageName, pathSave, true, true); // Вместе с разрешениями и аккаунтами
RestoreDetachedAppData
-
void RestoreDetachedAppData(string packageName, string pathToBackup, bool restorePermissions, bool restoreAccount)
Восстанавливает данные приложения без привязки к устройству, на котором был сделан бэкап. Необходимо использовать модуль ZennoBackup.Параметры:
restorePermissions— восстанавливать разрешения;restoreAccount— восстанавливать связанные аккаунты.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var pathLoad = @"/dir/bakups/name_bakup"; // Путь хранения бэкапа
app.RestoreAppData(packageName, pathLoad); // Загрузить бэкап
RestoreFlutterLib
-
void RestoreFlutterLib(string packageName)
Восстанавливает оригинальную библиотеку Flutter (libflutter.so), отменяя ранее применённый патч.Параметры:
packageName— имя пакета приложения.
Пример.
var app = instance.DroidInstance.App;
app.RestoreFlutterLib("com.app.flutter"); // Вернуть оригинальную библиотеку приложения
SetFakeCameraFraming
-
void SetFakeCameraFraming(string packageName, double anchorX, double anchorY, double zoom, int rotate, bool fit)
Задаёт, как видео вписывается в кадр, который запросило приложение. Само видео при этом не меняется.Параметры:
packageName— имя пакета приложения;anchorX— какая часть видео остаётся при обрезке по горизонтали, от0до1:0— левый край,1— правый,0.5— середина. Действует, только когда есть что обрезать;anchorY— то же по вертикали:0— верх,1— низ;zoom— приближение с сохранением пропорций, от0.1до10.1— без приближения,2показывает середину видео вдвое крупнее. Меньше1— видео отдаляется: сначала в кадр возвращаются обрезанные края, и только потом появляются чёрные поля;rotate— поворот видео по часовой стрелке:0,90,180или270. Для видео, снятого или сохранённого не той стороной вверх;fit—trueпоказывает видео целиком, добавляя чёрные поля там, где оно не достаёт до краёв кадра. По умолчанию выключено; включать стоит там, где иначе хуже. Например, приложение просит широкий кадр, получает вертикальное видео и потом обрезает его ещё раз в круглый видоискатель - лицо может не попасть в кадр.
Описание:
Видео и кадр приложения редко совпадают по форме, поэтому при расхождении часть видео обрезается - эти настройки говорят, какая именно. Если формы совпадают, настройки не меняют ничего, так что первое, что стоит попробовать - видео той же формы, что просит приложение.Значения вне диапазона приводятся к границе, а не вызывают ошибку. Настройка применяется на ходу, не перезапуская ни приложение, ни его сессию камеры, и сохраняется при последующей смене видео.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.camera2"; // Стандартное приложение «Камера»
app.SetVideoForFakeCamera(packageName, @"c:\source.mp4");
app.SetFakeCameraFraming(packageName, 0.5, 0.5, 1, 0, false); // Середина видео, без поворота и приближения
app.SetFakeCameraFraming(packageName, 0.5, 0.3, 1.5, 0, false); // Ближе к верху и крупнее
app.SetFakeCameraFraming(packageName, 0.5, 0.5, 1, 90, false); // Повернуть на четверть по часовой стрелке
app.SetFakeCameraFraming(packageName, 0.5, 0.5, 1, 0, true); // Видео целиком, с чёрными полями
SetVideoForFakeCamera
-
void SetVideoForFakeCamera(string packageName, string videoSource)
Подменяет камеру приложения видеофайлом: приложение получает кадры видео так, как будто они пришли с камеры устройства. Видео проигрывается по кругу, без звука, все потоки кадров остаются виртуальными. Если приложению нужно ещё и сохранять фотографии, используйте перегрузку с параметрами воспроизведения.Параметры:
packageName— имя пакета приложения;videoSource— путь к видео. Либо локальный путь на ПК (например,c:\source.mp4) — тогда файл отправляется на устройство, либо путь, который уже существует на устройстве (начинается с/, например/sdcard/Download/source.mp4) — тогда файл копируется без передачи с ПК. Пустая строка отключает подмену и возвращает реальную камеру.
Описание:
Подходит любой контейнер, который умеет декодировать MediaCodec (.mp4,.mkv,.webm,.3gp,.m4v,.mov), а разрешение видео не обязано совпадать с тем, которое запрашивает приложение.Видео кешируется на устройстве по хешу содержимого, поэтому повторная отправка того же файла — или его использование для другого приложения — не передаёт его второй раз.
Видео можно заменить на ходу: следующий вызов переключает воспроизведение, не перезапуская ни приложение, ни его сессию камеры.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.camera2"; // Стандартное приложение «Камера»
// Видео с ПК: отправляется на устройство, проигрывается по кругу и без звука
app.SetVideoForFakeCamera(packageName, @"c:\source.mp4");
Имя стандартного приложения «Камера» на разных устройствах отличается. Чтобы его узнать, откройте камеру на устройстве, а затем инструмент Установленные приложения — идентификатор будет в группе «Активное приложение на переднем плане».
-
void SetVideoForFakeCamera(string packageName, string videoSource, bool loop, bool mute, bool photo)
То же самое, но с явно заданными параметрами воспроизведения.Параметры:
packageName— имя пакета приложения;videoSource— путь к видео на ПК или на устройстве, либо пустая строка для отключения подмены;loop— запускать видео заново, когда оно закончилось. Приfalseна экране остаётся последний кадр;mute— заглушить звуковую дорожку видео. Передайтеfalse, чтобы звук проигрывался;photo— разрешить приложению-камере довести до конца сохранение фотографии.
-
void SetVideoForFakeCamera(string packageName, string videoSource, bool loop, bool mute, bool photo, bool synth)
То же самое, но с выбором того, откуда приложение получает камеру.Параметры:
packageName— имя пакета приложения;videoSource— путь к видео на ПК или на устройстве, либо пустая строка для отключения подмены;loop— запускать видео заново, когда оно закончилось;mute— заглушить звуковую дорожку видео;photo— разрешить приложению-камере довести до конца сохранение фотографии;synth— выдавать приложению камеру модуля вместо того, чтобы перехватывать ту, которую открывает устройство. По умолчанию выключено. Нужно там, где камеры в списке есть и на запросы отвечают, но кадров с них не приходит: эмулируемый телефон или аппарат со сломанной камерой.
Пример со всеми параметрами.
var app = instance.DroidInstance.App;
var packageName = "com.android.camera2"; // Стандартное приложение «Камера»
app.SetVideoForFakeCamera(
packageName,
"/sdcard/Download/source.mp4", // Видео, которое уже лежит на устройстве
true, // loop - повторять
true, // mute - заглушить звук
false, // photo - прохождение KYC
true); // synth - камеры в списке есть, но кадров с них не приходит
Подмена начинает работать только после того, как модуль ZennoVCam включён в LSPosed, а целевое приложение добавлено в его список. Сделать это можно через LSPosed API — включив подмену для стандартного приложения «Камера»:
var packageName = "com.android.camera2"; // Стандартное приложение «Камера»
instance.DroidInstance.App.Close(packageName); // Закрыть приложение
var lspHelper = new LSPosedHelper(instance.DroidInstance);
lspHelper.ModuleName = "com.zennolab.zennovcam"; // Работать с модулем ZennoVCam
lspHelper.SetPackages(packageName); // Задать приложение в списке подмены модуля ZennoVCam
lspHelper.EnableModule(); // Включить модуль ZennoVCam
instance.DroidInstance.App.SetVideoForFakeCamera(packageName, @"c:\source.mp4"); // Подменить камеру видео
instance.DroidInstance.App.Open(packageName); // Открыть приложение
Список приложений задаётся до включения модуля: с пустым списком EnableModule завершится ошибкой Add any package!. Устанавливать модуль вручную не нужно — SetPackages доставит его на устройство, если он ещё не установлен.
com.zennolab.zennovcam, в «Приложения» — приложение, которому подменяется камера, и включается сам модуль.- Параметр
photoпо умолчанию выключен, потому что это компромисс, а не улучшение: чтобы сохранение фотографии прошло, модуль отдаёт реальной камере вспомогательные потоки кадров (замер экспозиции, миниатюры). Оставьтеfalseдля сканеров и KYC-приложений, которые читают кадры через такие потоки, — иначе они получат изображение реальной камеры.
Uid
-
string Uid(string packageName)
Получает UID приложения.Параметры:
packageName— имя пакета.
Возвращает:
UID приложения.
Пример.
var app = instance.DroidInstance.App;
var packageName = "com.android.chrome"; // Имя приложения
var uid = app.Uid(packageName); // Получить uid приложения