2015-12-22 29 views
13

Dışarıdan bir kaynaktan girdi alan bir BroadcastReceiver var.Aynı String girdisinden beklenmeyen farklı sonuçlar

Bu alıcı daha sonra bir "fare benzeri" programı olarak davranması ve sisteme giriş işlemlerini göndermelidir. Kök erişim ve izinlerim var.

Benim sorunum bir String gibi "input tap 275 410" gönderdikleri zaman bile Ancak örneğin "input" + " tap" + " 275" + " 410", hala çalışıyor dize ...

bölünmüş eğer dize olarak monte zaman, program, doğru davranır olmasıdır istenen: ayıklama, tüm izlenen Strings aynı olsa

"input " + CursorSystem.command + " " + coords[0] + " " + coords[1]

Sonra hiçbir şey ... olmuyor (eksi konum):

value = {char[26]@830031306976} 0 = 'i' 105 1 = 'n' 110 2 = 'p' 112 3 = 'u' 117 4 = 't' 116 5 = ' ' 32 6 = 't' 116 7 = 'a' 97 8 = 'p' 112 9 = ' ' 32 10 = '2' 50 11 = '7' 55 12 = '5' 53 13 = ' ' 32 14 = '4' 52 15 = '1' 49 16 = '0' 48 17 = '\u0000' 0 18 = '\u0000' 0 19 = '\u0000' 0 20 = '\u0000' 0 21 = '\u0000' 0 22 = '\u0000' 0 23 = '\u0000' 0 24 = '\u0000' 0 25 = '\u0000' 0 

Sonuçların etkili olmaması nedeniyle, bir rehberlik veya özellik incelemek istiyorum. Anlayabildiğim kadarıyla, bu bir izin meselesi değildir, ne de bir iplik meselesi değildir, çünkü Loglar izin talebini (ve hibe) gösterir, çünkü İp Alıcının yürütüldüğü süre boyunca yaşar (o zaman bir süre [30+ saniye])

sonra öldürülmeden, çok uzun süre Receiver.onReceive hata ayıklamak:

public void onReceive(Context context, Intent intent) { 
    String command = intent.getStringExtra("command"); 
    String touch = intent.getStringExtra("touch"); 
    if (Executor.isRootAvailable()) { 
     Executor executor = new Executor(); 
     ArrayList<String> commands = new ArrayList<>(); 
     if (command != null) { 
      if (command.length() > 0) { 
       if (commands.add("input " + command)) { 
        executor.execute(commands); 
       } 
      } 
     } else if (touch != null) { 
      if (CursorSystem.isAlive) { // Always true for the executions 
       CursorSystem.doInput(); 
       if (CursorSystem.state == CursorSystem.STATE) { // Always true for the executions 
        int[] coords = CursorSystem.coordinates; 
        if (coords != null) { 
// This line is where (I guess) that the problem lies. 
// CursorSystem.command is "tap", coords[0] and coords[1] is the result of (a view).getLocationOnScreen(coordinates) 
// It results in a 2 positions int array with (x, y) coordinates, these values are always correct. 
         if (commands.add("input " + CursorSystem.command + " " + coords[0] + " " + coords[1])) { 
          executor.execute(commands); 
          CursorSystem.doInput(); 
         } else { 
          // error... 
         } 
        } else { 
         // error... 
        } 
       } else { 
        // error... 
       } 
      } else { 
       error... 
      } 
     } else { 
      error... 
     } 
    } else { 
     error... 
    } 
} 

Executor.execute:

Sorun kullanıcıyı destekli CursorSystem kullanılan ImageViews ne etkileşim istenen edildi "hedef" olarak olmasıydı bulundu

:

+0

"Executor.execute" ifadenizde, her zaman değişmediğiniz için her zaman yanlış olan "resp" değerini döndürürsünüz. Nasıl olması gerekiyordu? –

+0

Ayrıca, CursorSystem sınıfının tam olarak ne olduğunu ve "value" satırını biçimlendirebileceğini de belirtebilir misiniz? Sanırım 'CursorSystem' kendi sınıfınız.Tam kodunu görmek faydalı olacaktır. –

+0

@AkashAggarwal Evet, temel olarak kod şu anda bir inceleme karmaşası olduğu için. Kod sonuçta 'return (suProcessRetval! = 255)' e ulaşacak, bu da doğru olarak değerlendirilecek ... Ayrıca, 'CursorSystem' sınıfında iki bin satırdan fazla kod var. Kullanılan temel değişkenler her zaman ayarlanmış (en azından hiç bir zaman), 'CursorSystem.isAlive 'her zaman' true 'olarak hata ayıklanır, gösterilen diğer kodların çoğu aslında farklıdır ve soru için sadeleştirilmiştir. Aynı zamanda, hiçbir LogCat hatası görünmez, 'İstisnalar atılmaz, hata yok .... ve yanıt yok. – Bonatti

cevap

3

ile değiştirin (ve burada). Yürütme sırasında komut alınabilir ve görüntü komutun gerçekleşeceği yere taşınır, böylece olayı "alır".

ekleme aşağıdaki bayraklar:

.LayoutParams.FLAG_NOT_FOCUSABLE 
.LayoutParams.FLAG_NOT_TOUCHABLE 
.LayoutParams.FLAG_LAYOUT_NO_LIMITS 

etkileşim halinde yanı sıra, sınırların dışında onları "çizmek" olarak Görüntüleme düşünmüyoruz sistemi İzin kullanıcı olabilir "tokatlamak" cihaz gizli menüler böylece Ayrıca potansiyel olarak OLMAYABİLECEK bir hedefe tıklayın. Bu, bazı "Launcher" programlarına, MotionEvent'i engellemeye ve hiçbir şey yapmadı.

komut

sadece hayır sonuç gösterilmekte olduğu başarıyla yürütüldü ve "hiçbir şey yapmadan" olarak yorumlamak bize neden ediliyordu.

-1

ilgilenen herkes için

if (commands.add("input " + CursorSystem.command + " " + coords[0] + " " + coords[1])) { 
          executor.execute(commands); 
          CursorSystem.doInput(); 
         } 

String newCommand = "input " + CursorSystem.command + " " + coords[0] + " " + coords[1]; 
newCommand = newCommand.replace("\u0000", "").replace("\\u0000", "");// removes NUL chars and backslash+u0000 
if(commands.add(newCommand)){ 
    executor.execute(commands); 
    CursorSystem.doInput(); 
    } 
+0

Bu soruya OP'nin sorusunu yanıtlayabilirken, herhangi bir açıklama yapmadan katı kod bloklarının gönderilmesi hiçbir eğitim amacına hizmet etmemektedir. Lütfen bu kodun neden bir çözüm olduğunu veya OP'nin neyin değiştiğini ve hangi sebepten kaynaklandığını açıklayarak cevabınızı geliştirin. –

+0

Kod satırımı yorumladım: "// NUL chars ve backslash + u0000 kaldırır" yeterli değil mi? –

+0

@LinhNguyen Soruda belirtildiği gibi, String argümanı eşittir. Boş karakterler veya istenmeyen karakterler (boşluk, yeni çizgi, satır besleme, vb.) Yoktur. Sorun, kodun içinde görünmüyor, çünkü uygulamaya verilen "düzeltme", Hizmet veya sınıfını değiştirmedi. – Bonatti