2017-10-04 9 views
1

J'ai le problème suivant.Comment écrire un fichier * .kl et le copier dans/system sur un système enraciné

Je dois verrouiller ma tablette pour une application spécifique. J'utilise mon application en KioskMode, mais j'ai besoin de bloquer certains boutons, "Switch_app", "Volume_UP", "Volume_DOWN", etc.

J'ai été capable de bloquer ces boutons en accédant à l'explorateur de fichiers ES et en changeant le fichier manuellement, en enregistrant et en redémarrant la tablette.

Cependant, je voudrais changer ce fichier progammatically.

J'ai essayé ce qui suit:

 { 
      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); 
     } 
    } 

Et pour transférer le fichier créé pour/système/usr/Keylayout J'utilise ceci:

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"); 

Lorsque j'utilise ces commandes, le fichier est copié, mais lorsque je redémarre la tablette, plus aucun bouton physique ne fonctionne. Donc, je crois que c'est un problème lié à la suppression de l'ancien fichier et à l'ajout du nouveau.

Toute aide sera la bienvenue ainsi que des idées.

Merci à tous.

Répondre

2

Il n'y a pas besoin de se soucier de la propriété, autorisations, etc. si vous utilisez sed « s en place édition:

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"); 

Vous avez encore besoin pour redémarrer cependant.

+0

Merci Alex P. Vous m'avez beaucoup aidé parce que je faisais face à des problèmes de permissions et maintenant je ne les ai plus. Pouvez-vous me poser une question? Si je dois désactiver, comment écris-je l'inverse? –

+0

Supprimer le commentaire sur VOLUME_DOWN - VOLUME_UP –

0

C'est la solution des dispositifs Enracinée

 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");**