Eu tenho postado meu salto resulta no meu círculo de amigos há muito tempo. Hoje eu acidentalmente vi um vídeo de um colega que usou o código para fazer pontuações. Fui ao Baidu e vi o código (o código estava no final). Depois de várias reviravoltas, finalmente corri com sucesso e marquei um pouco.
Primeiro, vamos falar brevemente sobre as etapas:
1. Código de pontuação do download do Baidu
2. Instale o adb
3. Encontre um telefone para conectar -se ao computador usando o modo de depuração USB
4. Comece o mini -programa WeChat
5. Execute o código no Eclipse (aqui precisamos depurar e modificar constantemente os parâmetros de acordo com o tamanho da tela do telefone celular)
O resultado é que a tela do telefone pressionará automaticamente e deixará a peça de xadrez pular.
Vamos falar sobre a pergunta:
1. Instale o conjunto de problemas do ADB:
Baixe o endereço da ferramenta ADB
No gerenciador de dispositivos aqui, se não estiver instalado em outros dispositivos, o ADB é um ponto de exclamação. Após a instalação, como mostrado na figura, o dispositivo Android de linha aparecerá.
Se você o instalar, clique com o botão direito do mouse na coluna ADB para selecionar Propriedades e a interface a seguir é exibida, clique em Atualizar driver, selecione Procurar computador e selecionar programas (ou seja, a segunda opção). No momento, uma opção de driver de navegação no computador será exibida, selecione o local do pacote de instalação e tudo será lançado para instalar.
A questão é:
Após a instalação, você pode usar o ADB na janela de comando CMD, mas a execução do código no Eclipse não tem efeito (o programa não relata um erro e não há capturas de tela no telefone) e, em seguida, o console do Eclipse mostra que a imagem não existe.
No momento, você precisa copiar as duas DLLs de bibliotecas de links dinâmicos que você instalou nos dois diretórios a seguir: (se você não conseguir encontrá -los, pesquise globalmente na unidade C)
adb.exe
Adbwinapi.dll
Adbwinusbapi.dll
C:/Windows/System32
C:/Windows/syswow64
Neste momento, ele deve ser colocado sob syswow64. Eu sou Win7 64 bit, então existe esse diretório (outras pessoas na internet dizem que o Win32 não precisa colocar isso, eu não tentei).
Se o diretório syswow64 não for colocado, a operação do Eclipse ainda não terá efeito no momento: mas se você executar o shell screencap de adb --p /sdcard/tencent/customerpic/current.png comando em CMD, você encontrará que haverá uma imagem atual.
Descobri que estava usando o CD para System32 e no diretório de instalação (C:/Arquivos de Programas (x86)/Thunder Network/Thunder/Program), executei com sucesso o comando acima no programa e relatei um erro no System32:
--------------------------------------------------------------------------------------------------------------------------------------------------
Este programa não pode ser iniciado porque o adbwinapi.dll está ausente no computador. Tente reinstalar o programa para resolver esse problema.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Claro
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OK, isso significa que o ADB no System32 não consegue encontrar o arquivo de link dinâmico adbinapi.dll, mas é óbvio que, por acaso, eu vi o diretório syswow64 e o que esse diretório significa e o que isso significa? OK, copie os três arquivos copiados para o diretório System32 e copie -os para este diretório syswow64 e faça -o.
Pergunta 2: dispositivo offline
A execução do shell adb na janela de comando CMD resultou em um dispositivo de erro offline. Eu pensei que havia algo errado com minha instalação do ADB. Eu tinha muito Baidu. Eu tentei o ADB Kill Server, o ADB Remount e outros comandos, mas achei que o código era /sdcard /. Vi que este deveria ser um cartão SD externo. O caminho está errado? (Eu usei o Vivo X9, e este telefone não possui opção de cartão SD externo). Depois de mudar para um telefone mais antigo (Vivo Y27), posso executar o shell do ADB, mas /SDCARD não é um caminho externo do cartão SD, mas o caminho do disco U do telefone.
Isso significa que não deve ser um problema de caminho de código. Disseram -me que a ferramenta ADB é muito antiga e a versão do ADB possui versão 1.0.26. Bem, estou com preguiça de encontrar a nova versão do ADB. Debugi com o antigo Vivo Y27 e ele pode ser exibido.
Deixe -me listar o que aprendi:
1. Sei que existe o ADB e também sei que o uso do shell do ADB pode obter a sessão de Bash do telefone. Você pode tirar capturas de tela e o uso do ADB Pull pode obter arquivos do telefone. Se houver mais comandos no site oficial, não me lembro, mesmo se lê -lo demais.
2. Saiba que o java usa o run time.getRuntime (). Exec () no código original para chamar comandos do sistema no Windows:
Process = RUNTime.GetRuntime (). Exec (comando); System.out.println ("Comando EXEC Start:" + Command); process.waitfor (); process.getInputStream (); BufferReader buffaredReader = new BufferredReader (new InputStreamReader (process.getErrorStream ())); Linha de string = bufferredreader.readline (); 3. Entenda que, no código, analise uma imagem calculando o valor de cor RGB da captura de tela, etc., int pixel = bufferiMage.getRgb (x, y);
Todos os códigos:
pacote com.lw.test; importar java.awt.image.bufferiMage; importar java.io.bufferedReader; importar java.io.file; importar java.io.ioException; importar java.io.inputStreamReader; importar java.util.arrays; importar java.util.Concurrent.TimeUnit; importar javax.imageio.imageio; /** * Reference Zhihu* * @link <a href="https://zhuanlan.zhihu.com/p/32452473" rel="external nofollow" target="_blank">https://zhuanlan.zhihu.com/p/32452473</a> * * Jump assist* * @author Leeho */ public class Jumpjumphelper {private estático final string image_name = "current.png"; Final String estático privado string store_dir = "d:/jump_screencapture"; // Quantidade private estática final int imageLengthLength = 5; // tamanho da imagem estática privada final long [] imageLength = novo longo [imageLengthLength]; private final rgbinfo rgbinfo = new rgbinfo (); private final string path = "/sdcard/tencent/clientepic/"; String final privada [] adb_screen_capture_cmds = {"adb shell screencap -p"+path+image_name, "adb pull"+path+"current.png"+store_dir}; // A coordenada Y na parte inferior da área de exibição de pontuação do jogo na captura de tela, 300 é o valor de 1920x1080. Modificar o private final int gamecoreBottomy = 300 de acordo com a situação real; // O coeficiente de tempo de imprensa pode ser ajustado adequadamente de acordo com a situação específica; Pressão duplo final privado duplo = 2,05; // A coordenada do ponto de partida da imprensa também é a coordenada do ponto de partida do próximo jogo, private Int Swipex = 280; Final privado Int Swipey = 600; // A altura da base da peça de xadrez é privada Int HalfbaseboardHeight = 20; // A largura da peça de xadrez é retirada da captura de tela e ajusta o final privado INT por si mesmo HalmabodyWidth = 74; // As coordenadas do ponto médio dos dois trampolins na captura de tela do jogo são usados principalmente para calcular o ângulo. A proporção de XY pode ser calculada com base na captura de tela real. Private final int boardx1 = 813; private final int boardy1 = 1122; private final int boardx2 = 310; private final int boardy2 = 813; / ** * Obtenha as damas e as coordenadas centrais do próximo trampolim * * @return * @author leeho * @throws ioexception * @Update 31 de dezembro de 2017 às 12:18:22 PM */ private int [] gethalmaandboardboardxyValue (FILEGRUNIMAGE) ThreliExeCception {] int width = bufferiMage.getWidth (); int height = bufferiMage.getHeight (); System.out.println ("Width:" + Width + ", altura:" + altura); int halmaxsum = 0; int halmaxCount = 0; int halmaymax = 0; int boardx = 0; int boardy = 0; // Transfira os pontos de pixel da captura de tela de cima para baixo e use a cor da peça de xadrez como base para o reconhecimento de posição. Finalmente, o valor médio de todos os pixels na linha mais baixa da cor da peça de xadrez é retirado, ou seja, calcule as coordenadas da peça de xadrez para (int y = gamecoreBottomy; y <altura; y ++) {para (int x = 0; x <width; x ++) {processrgbinfo (tampão, x, x, y); int rvalue = this.rgbinfo.getRvalue (); int gvalue = this.rgbinfo.getgValue (); int bvalue = this.rgbinfo.getbValue (); // Identifique a posição da peça de xadrez de acordo com a cor do rgb, if (rvalue> 50 && rvalue <60 && gvalue> 53 && gvalue <63 && bvalue> 95 && bvalue <110) {halmaxsum += x; halmaxCount ++; // Valor de coordenada y da linha inferior da peça de xadrez halmaymax = y> halmaymax? Y: Halmaymax; }}} if (halmaxsum! = 0 && halmaxCount! = 0) {// x Valor de coordenadas da linha inferior da peça de xadrez int halmax = halmaxsum /halmaxCount; // mova metade do chassi de xadrez altura do chassi para cima int halmay = halmaymax - HalfBaseboardHeight; // Comece a partir do gamecoreBottomy for (int y = gamecoreBottomy; y <altura; y ++) {processrgbinfo (bufferingImage, 0, y); int lastpixelr = this.rgbinfo.getRvalue (); int lastpixelg = this.rgbinfo.getgValue (); int lastpixelb = this.rgbinfo.getbValue (); // Desde que o valor calculado do Boardx seja maior que 0, significa que o valor X de coordenada central do próximo trampolim foi obtido. if (boardx> 0) {break; } int boardxSum = 0; int boardxCount = 0; for (int x = 0; x <largura; x ++) {processrgbinfo (bufferImage, x, y); int pixelr = this.rgbinfo.getRvalue (); int pixelg = this.rgbinfo.getgValue (); int pixelb = this.rgbinfo.getbValue (); // Treine o caso em que a cabeça da peça de xadrez é maior que o próximo trampolim se (Math.abs (x - halmax) <halmabodywidth) {continua; } // Digitalizar de cima para baixo para a posição do vértice do próximo trampolim. O próximo trampolim pode ser um círculo ou uma caixa. Pegue vários pontos e encontre a média se ((math.abs (pixelr - lastpixelr) + math.abs (pixelg - lastpixelg) + math.abs (pixelb - lastpixelb))> 10) {BoardxSum + = x; BoardxCount ++; }} if (BoardxSum> 0) {Boardx = Boardxsum / BoardxCount; }} // No ângulo real, encontre as coordenadas próximas ao centro da próxima placa. Boardy = (int) (Halmay - Math.abs (Boardx - Halmax) * Math.abs (Boardy1 - Boardy2) / Math.abs (Boardx1 - Boardx2)); if (boardx> 0 && boardy> 0) {int [] resultado = new int [4]; // o resultado da coordenada x [0] = halmax; // o resultado de coordenada y [1] = halmay; // o resultado da coordenada x [2] = Boardx; // o resultado de coordenada y [3] = boardy; resultado de retorno; }} retornar nulo; } / ** * Execute o comando * * @param comando * @author leeho * @update 31 de dezembro de 2017 às 12:13:39 * / private void executEcommand (string comando) {process Process = null; tente {process = runtime.getRuntime (). Exec (comando); System.out.println ("Comando EXEC Start:" + Command); process.waitfor (); process.getInputStream (); BufferReader buffaredReader = new BufferredReader (new InputStreamReader (process.getErrorStream ())); Linha de string = bufferredreader.readline (); if (line! = null) {System.out.println (linha); } bufferReader = new BufferredReader (new InputStreamReader (process.getInputStream ()); String line02 = bufferredreader.readline (); if (line02! = null) {System.out.println (line02); } System.out.println ("EXEC Comando End:" + Command); } catch (Exceção e) {e.printStackTrace (); } finalmente {if (process! = null) {process.Destroy (); }}} / ** * adb recebe screenShots do Android * * @Author Leeho * @Update 31 de dezembro de 2017 12:11:42 * / private void ExecutEadBCaptureCommands () {for (String Command: adb_screen_capture_cmds) {comandommand (); }} / ** * Jump * * @param Distância * @author leeho * @update 31 de dezembro de 2017 às 12:23:19 * / private void Dojump (distância dupla) {System.out.println ("distância:" + distância); // Calcule o tempo de imprensa, mínimo 200ms int PressTime = (int) Math.max (Distance * PresstimeCoe eficiente, 200); System.out.println ("PressTime:" + PressTime); // Execute o comando da Operação da Operação Pressione = String.format ("Swipe de entrada do shell adb %S %S %S %S %S", Swipex, Swipey, Swipex, Swipey, Presstime); System.out.println (comando); executEcommand (comando); } / ** * Outro jogo * * @Author Leeho * @Update 31 de dezembro de 2017 às 12:47:06 * / private void replaygame () {string command = string.format ("adb shell entrada tap %s %s", swipex, swipey); executEcommand (comando); } / ** * Calcule a distância do salto, isto é, a distância entre dois pontos * * @param halmax * @param halmay * @param boardx * @param boardy * @return * @author leeho * @update 31 de dezembro de 2017 às 12:27:30 * / privado computJumpDax (INTRESTANTE (INTSTATEM INTROMAX (INTROUMAT), INTSTATATE (INTSTATEM INTROMENT), INTSTATAX (INTROPDATE, 31 de dezembro de 2017 às 12:27:30 Pm Math.Sqrt (Math.pow (Math.abs (Boardx - Halmax), 2) + Math.pow (Math.abs (Boardy - Halmay), 2)); } public static void main (string [] args) {jumpjumphelper jumpjumphelper = new jumpjumphelper (); // string command = "adb shell screencap -p" + jumpjumphelper.path + image_name; //// command = "Dispositivos ADB"; // jumpjumphelper.execteCommand (comando); // // if (true) {return;} try {arquivo storedir = new File (store_dir); if (! storedir.exists ()) {sinalizador booleano = stororedir.mkdir (); if (! flag) {System.err.println ("Criar falha no diretório de armazenamento de imagem"); retornar; }} // número de execuções int executEcount = 0; para (;;) {// Execute o comando adb para obter o Android ScreenShot jumpjumphelper.executEdBCaptureCommands (); Arquivo currentImage = novo arquivo (store_dir, image_name); if (! currentImage.exists ()) {System.out.println ("A imagem não existe"); continuar; } comprimento longo = currentImage.Length (); imageLength [executEcount % imageLengthLength] = comprimento; // Verifique se você precisa reiniciar o jumpjumphelper.checkDoreplay (); executEcount ++; System.out.println ("Currentth" + ExecutEcount + "Execution!"); // Obtenha as coordenadas centrais de damas e placa de base int [] resultado = jumpjumphelper.gethalmaandboardxyValue (currentImage); if (resultado == null) {System.out.println ("O resultado do método gethalmaandboardxyValue é nulo!"); continuar; } int halmax = resultado [0]; int halmay = resultado [1]; int boardx = resultado [2]; int boardy = resultado [3]; System.out.println ("halmax:" + halmax + ", halmay:" + halmay + ", boardx:" + boardx + ", boardy:" + boardy); // calcule a distância da sala de salto duplo de salto = jumpjumphelper.computeJumpDistance (Halmax, Halmay, Boardx, Boardy); jumjumphelper.dojump (Jumpdistance); // Fique por 2,5 segundos a cada tempo }} catch (Exceção e) {e.printStackTrace (); }} / ** * Verifique se você precisa reiniciar * * @Author Leeho * @Update 31 de dezembro de 2017 13:39:18 * / private void checkDoreplay () {if (imageLength [0]> 0 && imageLength [0] == ImageLength [1] &&Enngthength [] [1] [1] [ImagElngthngth [0] == imageLength [1] &&Enngthength [1] imageLength [3] == imageLength [4]) {// Isso significa que o tamanho da imagem tem sido o mesmo há 5 vezes. Você pode saber que a tela atual está em outra rodada de matrizes.Fill (imageLength, 0); // simular e clique no botão para iniciar o jogo novamente reprodusegame (); }} / ** * Obtenha o valor RGB das coordenadas especificadas * * @param bufferImage * @param x * @param y * @author leeho * @update 2017-02-31 12:12:43 pm * / private void ivgbinfo (bufferedesage tuffufferiMage, x, x, x, ntrg. int pixel = bufferImage.getRgb (x, y); // converte em rgb digit this.rgbinfo.setrValue ((Pixel & 0xff0000) >> 16); this.rgbinfo.setGValue ((Pixel & 0xff000) >> 8); this.rgbinfo.setBValue ((Pixel & 0XFF)); } classe rgbinfo {private int rvalue; private int gvalue; private int bvalue; public int getrValue () {return rvalue; } public void setRValue (int rvalue) {rvalue = rvalue; } public int getGvalue () {return gvalue; } public void setGValue (int gvalue) {gvalue = gvalue; } public int getBValue () {return bValue; } public void setBValue (int bvalue) {bvalue = bValue; } public void reset () {this.rvalue = 0; this.gvalue = 0; this.bvalue = 0; }}}Obviamente, os resultados serão liberados depois de um tempo, mas como programador, ainda é bom. A partir da vulnerabilidade inicial de envio de postagem, o computador foi solicitado a pegar pacotes e modificar os dados como agente. Agora, o código simula cliques (embora não entre em vigor.)
Para mais conteúdo, você pode consultar o tópico especial "Jump On WeChat" para aprender.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.