0

Je souhaite injecter des événements tactiles dans l'appareil. J'utilise l'instrumentation pour cela. La méthode fonctionne bien sur Jelly Bean, mais elle n'injecte pas et ne donne aucune erreur dans Lollipop.Pourquoi la simulation d'événements tactiles dans Lollipop ne fonctionne pas

Lorsque j'ai cherché, j'ai trouvé que cela pouvait être dû à l'application de SELinux qui empêche certaines actions d'être exécutées à des fins de sécurité. J'ai téléchargé SELinux Mode Changer et mis SELinux à permissive, et je me suis assuré qu'il a été mis à permissive en vérifiant son statut dans About phone dans le settings. Mon appareil est enraciné, et j'ai essayé avec su et sans elle. Mais, vraiment, je ne sais pas quel est le problème.

Voici mon code:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     View view = findViewById (R.id.face); 

try { 

    Runtime.getRuntime().exec("supoliciy –live \"allow appdomain input_device dir (ioctl read getattr search open)\" \"allow appdomain input_device dir (ioctl read write getattr lock append open)\""); 
    //supoliciy –live "allow appdomain input_device dir (ioctl read getattr search open)" "allow appdomain input_device dir (ioctl read write getattr lock append open)" 
    // Runtime.getRuntime().exec("reboot"); 
    // Runtime.getRuntime().exec("su -c reboot"); 
    /* 

    Process process = Runtime.getRuntime().exec("su");//supolicy --live \"allow appdomain input_device dir { ioctl read getattr search open }\" \"allow appdomain input_device chr_file { ioctl read write getattr lock append open }\""); 
    DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
    String cmd = "/system/bin/input tap 100 200\n"; 
    os.writeBytes(cmd); 
    os.writeBytes("exit\n"); 
    os.flush(); 
    os.close(); 
    process.waitFor(); 
    */ 


    Process process = Runtime.getRuntime().exec("su");//supolicy --live \"allow appdomain input_device dir { ioctl read getattr search open }\" \"allow appdomain input_device chr_file { ioctl read write getattr lock append open }\""); 

} 
catch (IOException e) { 
    Toast toast = Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_LONG); 
    toast.show(); 
    e.printStackTrace(); 
// Log.e(" ", e.getStackTrace().toString()); 
} 
/* 
used in cmd case only 
     catch (InterruptedException e){ 
      Toast toast = Toast.makeText(getApplicationContext(), "ERROR 2", Toast.LENGTH_LONG); 
      toast.show(); 
     } 

*/ 


     final Instrumentation m_Instrumentation = new Instrumentation(); 
     final MotionEvent down = MotionEvent.obtain(SystemClock.uptimeMillis(), 
       SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 400, 600, 0); 
     down.setSource(InputDevice.SOURCE_TOUCHSCREEN); 

     final MotionEvent up = MotionEvent.obtain(SystemClock.uptimeMillis(), 
       SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 400, 600, 0); 
     up.setSource(InputDevice.SOURCE_TOUCHSCREEN); 


     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       m_Instrumentation.sendPointerSync(down); 
       m_Instrumentation.sendPointerSync(up); 
      } 
     }); 

     view.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       Toast toast = Toast.makeText(getApplicationContext(), "View touched", Toast.LENGTH_LONG); 
       toast.show(); 
       return false; 
      } 
     }); 

     t.start(); 


    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     Toast toast = Toast.makeText(getApplicationContext(), "View touched", Toast.LENGTH_LONG); 
     toast.show(); 
     return true; 
    } 
} 

J'ai même essayé d'exécuter supoliciy comme vous pouvez le voir dans le code ci-dessus, mais rien ne fonctionnait.

Comment puis-je résoudre ce problème?

Répondre

1

Quelle erreur voyez-vous? logcat devrait vous dire pourquoi il a été refusé. Il se peut que certaines autorisations supplémentaires vous manquent. En outre, les autorisations doivent être regroupées à l'aide d'accolades, pas de parenthèses.

L'erreur devrait ressembler à:

04-12 19: 57: 31,501 4885-4885 /? E/audit: type = 1400 msg = audit (1460509051.501: 7365): avc: denied {read} pour pid = 18086 comm = "yourappname" nom = "lux" dev = "sysfs" ino = 19601 scontext = u: r: untrusted_app: s0: C512, c768 tcontext = u: object_r: sysfs_sensor_writable: s0 tclass = fichier permissives = 0

Vous pouvez alors l'utiliser pour corriger/mettre à jour votre commande supolicy. Dans cet exemple, vous utiliserez "allow untrusted_app sysfs_sensor_writable file {read}" (les accolades ne sont pas nécessaires dans ce cas, mais vous ajouterez probablement plusieurs autorisations ici).