当前位置: 首页 > 知识库问答 >
问题:

如何在android模拟器上以编程方式设置虚拟场景图像

姜博
2023-03-14

我已经为一个颤振项目编写了一些驱动测试,还有一个条形码扫描仪功能,我可以使用android emulator提供的虚拟场景工具成功测试。

然而,有许多案例需要测试不同的条形码。我想在虚拟场景上为每个案例设置一个特定的条形码图像。可能吗?

我发现这个图像的值放在~/.android/avd/[emulatorName]/AVD.conf file上的virtualscene\posters变量上。

virtualscene\posters=@Variant(\0\0\0\b\0\0\0\x2\0\0\0\b\0w\0\x61\0l\0l\0\0\0\n\xff\xff\xff\xff\0\0\0\n\0t\0\x61\0\x62\0l\0\x65\0\0\0\n\xff\xff\xff\xff)

virtualscene\posters=@Variant(\0\0\0\b\0\0\0\x2\0\0\0\b\0w\0\x61\0l\0l\0\0\0\n\ 0\0\0\\\0/\0U\0s\0\x65\0r\0s\0/\0l\0\x65\0o\0n\0\x61\0r\0\x64\0o\0.\0\x61\0r\0m\0\x65\0r\0o\0/\0\x44\0\x65\0s\0k\0t\0o\0p\0/\0J\0\x61\0m\0\x65\0s\0W\0i\0l\0s\0o\0n\0.\0p\0n\0g\0\0\0\n\0t\0\x61\0\x62\0l\0\x65\0\0\0\n\xff\xff\xff\xff)

共有2个答案

徐阳炎
2023-03-14

可以将虚拟场景图像设置为指定路径。并在测试时操纵目标图像。由于插入仪器的测试在您的(虚拟)设备上运行,因此它无法直接操作主机文件。可以做的(这是一个丑陋的黑客行为)是在主机上启动一个服务器,可以通过主机回送“10.0.2.2”地址从虚拟设备访问该服务器。此服务器可以操作目标文件。如果有人有更好的解决方案,请分享!

这里是一个示例服务器和客户端。

服务器:

import java.io.*;
import java.net.*;
import java.nio.channels.FileChannel;

public class FileManipulatorServer {
    public static void main(String args[]) {
        int port = 6789;
        FileManipulatorServer server = new FileManipulatorServer( port );
        server.startServer();
    }

    // declare a server socket and a client socket for the server

    private ServerSocket fileManipulatorServer = null;
    private Socket clientSocket = null;
    private int port;

    public FileManipulatorServer(int port ) {
        this.port = port;
    }

    public void stopServer() {
        System.out.println( "Server cleaning up." );
        System.exit(0);
    }

    public void startServer() {
        // Try to open a server socket on the given port
        // Note that we can't choose a port less than 1024 if we are not
        // privileged users (root)

        try {
            fileManipulatorServer = new ServerSocket(port);
        }
        catch (IOException e) {
            System.out.println(e);
        }

        System.out.println( "Waiting for connections. Only one connection is allowed." );

        // Create a socket object from the ServerSocket to listen and accept connections.
        // Use FileManipulatorTask to process the connection.

        while ( true ) {
            try {
                clientSocket = fileManipulatorServer.accept();
                FileManipulatorTask task = new FileManipulatorTask(clientSocket, this);
                task.run();
            }
            catch (IOException e) {
                System.out.println(e);
            }
        }
    }
}

class FileManipulatorTask {
    private BufferedReader is;
    private PrintStream os;
    private Socket clientSocket;
    private FileManipulatorServer server;

    public FileManipulatorTask(Socket clientSocket, FileManipulatorServer server) {
        this.clientSocket = clientSocket;
        this.server = server;
        System.out.println( "Connection established with: " + clientSocket );
        try {
            is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            os = new PrintStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            System.out.println(e);
        }
    }

    public void run() {
        String line;
        try {
            boolean serverStop = false;

            line = is.readLine();
            System.out.println( "Received " + line );
            saveImageToPoster(line.trim());

            os.println("OK");
            os.flush();

            System.out.println( "Connection closed." );
            is.close();
            os.close();
            clientSocket.close();

            if ( serverStop ) server.stopServer();
        } catch (IOException e) {
            System.out.println(e);
        }
    }

    private void saveImageToPoster(String filename) {

        try {
            FileChannel src = new FileInputStream("C:\\fullpathtopostercandidates\\"+filename).getChannel();
            FileChannel dest = new FileOutputStream("C:\\fullpathtoconfiguredposter\\poster.jpg").getChannel();
            dest.transferFrom(src, 0, src.size());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户:

import java.io.*;
import java.net.*;

public class FileNameSenderClient {

    private String hostname = "10.0.2.2";
    private int port = 6789;

    public void sendFileName(String filename) {

        Socket clientSocket = null;
        DataOutputStream os = null;
        BufferedReader is = null;
        try {
            clientSocket = new Socket(hostname, port);
            os = new DataOutputStream(clientSocket.getOutputStream());
            is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + hostname);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: " + hostname);
        }


        if (clientSocket == null || os == null || is == null) {
            System.err.println( "Something is wrong. One variable is null." );
            return;
        }

        try {
            System.out.println("Write to output stream");
            os.writeBytes( filename +"\n");
            os.flush();
            String responseLine = is.readLine();             
            System.out.println("Server returns: " + responseLine);
            os.close();
            is.close();
            clientSocket.close();
        } catch (UnknownHostException e) {
            System.err.println("Trying to connect to unknown host: " + e);
        } catch (IOException e) {
            System.err.println("IOException:  " + e);
        }
    }
}

像这样使用检测测试中的FileNameEnderClient。

@Test
public void testQRcodeReadingOK()
{
   FileNameSenderClient c = new FileNameSenderClient();
   c.sendFileName("QRCode.jpg");

   //your code that wants to use the image, like the this:

    onView(withId(R.id.load_qr_code)).perform(click());
}
左丘昕
2023-03-14

您可以替换位于<code>的默认(全局)映像:$ANDROID_SDK_HOME/emulator/resources/poster。png与您的海报。png图像,也不要通过编辑文件<code>更改默认指针$ANDROID_SDK_HOME/emulator/resources/Toren1BD.posters。

 类似资料:
  • 我试图在我的应用程序中使用模拟位置进行测试。要接收位置更新,我使用最新的Android开发者留档在这里:https://developer.android.com/training/location/receive-location-updates 本教程使用FusedLocationProviderClient和locationClient。requestLocationUpdates(crea

  • 我正在使用Android模拟器(版本28.0.23-5264690)来开发使用QR码的应用程序。模拟器上摄像机的虚拟场景功能具有一个选项,用于将您自己的图像添加到场景中: 将模拟器与相机应用程序一起使用时,您可以导入PNG或JPEG格式的图像以在虚拟场景中使用。要选择在虚拟场景中使用的图像,请单击在相机中添加图像- 此功能可用于导入QR码等自定义图像,以便在任何基于摄像头的应用程序中使用。 然而,

  • 我正在为扫描条形码的应用程序做UI测试。我已经成功地找到了在模拟器虚拟场景中插入条形码图像来测试扫描的方法。 我认为一种方法是实时替换图像,但我认为需要重新启动模拟器,而且它看起来很脏,我不知道如何在kaspresso中实现它。另一种方法是在扫描器中注入假结果,但是端到端UI测试的目的就失去了,所以。。。 什么是最好的方法来做到这一点并实现它(如果可能的话)。我正在寻找答案,但似乎还没有人做到这一

  • 从Android 4.0,它支持卷下电源键截图并保存在画廊。但是如何在Android模拟器中做到这一点。 我知道在eclipse中有一个“截图”按钮,但这不是我想要的。我需要它在模拟器和保存在模拟器。

  • 你知道有什么解决办法吗?如果可能的话,我不想使用第三方库。