Как написать файл * .kl и скопировать в / system в корневой системе
У меня следующая проблема.
Мне нужно заблокировать планшет для конкретного приложения. Я использую свое приложение в KioskMode, однако мне нужно заблокировать некоторые кнопки, "Switch_app", "Volume_UP", "Volume_DOWN" и т. Д.
Мне удалось заблокировать эти кнопки, открыв ES File Explorer и изменив файл вручную, сохранив и перезагрузив планшет.
Тем не менее, я хотел бы изменить этот файл программно.
Я пробовал следующее:
{
using (StreamReader sr = new StreamReader("/system/usr/keylayout/Generic.kl"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
if (line.Contains("VOLUME"))
{
line = $"# {line}";
}
text += line + "\n";
System.Console.WriteLine(text);
}
}
CreateFile();
TransferFile();
};
void CreateFile()
{
string sdCard = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
string path = Path.Combine(sdCard, "MyFolder/Generic.kl");
// This text is added only once to the file.
if (!System.IO.File.Exists(path))
{
// Create a file to write to.
System.IO.File.WriteAllText(path, text);
}
}
И для передачи созданного файла в / system / usr / Keylayout я использую это:
Java.Lang.Runtime.GetRuntime().Exec("su -c mount -o rw,remount,rw /system");
Java.Lang.Runtime.GetRuntime().Exec("su -c rm system/usr/keylayout/Generic.kl");
Java.Lang.Runtime.GetRuntime().Exec("su -c mv /storage/emulated/0/MyFolder/Generic.kl system/usr/keylayout/Generic.kl");
Когда я использую эти команды, файл копируется, но при перезагрузке планшета больше не работают физические кнопки. Поэтому я считаю, что это связано с удалением старого файла и добавлением нового.
Любая помощь будет приветствоваться, а также идеи.
Спасибо вам всем.
2 ответа
Нет необходимости беспокоиться о правах собственности, разрешениях и т. Д., Если вы используете sed
на месте редактирования:
GetRuntime().Exec("su 0 mount -o remount,rw /system");
GetRuntime().Exec("su 0 sed -i 's/^[^#]*VOLUME_DOWN/# &/' /system/usr/keylayout/Generic.kl");
GetRuntime().Exec("su 0 sed -i 's/^[^#]*VOLUME_UP/# &/' /system/usr/keylayout/Generic.kl");
GetRuntime().Exec("su 0 sed -i 's/^[^#]*APP_SWITCH/# &/' /system/usr/keylayout/Generic.kl");
Вам все еще нужно перезагрузить хотя.
Это решение рутованных устройств
Java.Lang.Runtime.GetRuntime().Exec("su -c mount -o rw,remount,rw /system");
Java.Lang.Runtime.GetRuntime().Exec("su -c rm system/usr/keylayout/Generic.kl");
Java.Lang.Runtime.GetRuntime().Exec("su -c mv /storage/emulated/0/MyFolder/Generic.kl system/usr/keylayout/");
**Java.Lang.Runtime.GetRuntime().Exec("su -c chmod 644 /system/usr/keylayout/Generic.kl");
Java.Lang.Runtime.GetRuntime().Exec("su -c chown system.system /system/usr/keylayout/Generic.kl");**