Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Android套接字发送图像位图 我的老师给了我一个作业,一个安卓工作室的小项目。 我想获得一个好成绩,所以我正在尝试创建一个允许传送照片的应用程序, 连接到同一WIFI网络的两部手机之间。(带插座)_Android_Sockets - Fatal编程技术网

如何通过Android套接字发送图像位图 我的老师给了我一个作业,一个安卓工作室的小项目。 我想获得一个好成绩,所以我正在尝试创建一个允许传送照片的应用程序, 连接到同一WIFI网络的两部手机之间。(带插座)

如何通过Android套接字发送图像位图 我的老师给了我一个作业,一个安卓工作室的小项目。 我想获得一个好成绩,所以我正在尝试创建一个允许传送照片的应用程序, 连接到同一WIFI网络的两部手机之间。(带插座),android,sockets,Android,Sockets,我创建了一个应用程序,可以让你向服务器发送字符串, 但是我不知道怎么发送照片。 (照片选择部分已完成) 以下是我的客户代码: void client() throws IOException{ ipAddr = ipAddrEditText.getText().toString(); InputStream imageStream = getContentResolver().openInputStream(imageUri); final Bit

我创建了一个应用程序,可以让你向服务器发送字符串, 但是我不知道怎么发送照片。 (照片选择部分已完成)

以下是我的客户代码:

void client() throws IOException{
        ipAddr = ipAddrEditText.getText().toString();
        InputStream imageStream = getContentResolver().openInputStream(imageUri);
        final Bitmap imageBitMap = BitmapFactory.decodeStream(imageStream);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        imageBitMap.compress(Bitmap.CompressFormat.PNG,0, bos);
        byte[] array = bos.toByteArray();

        Socket s = new Socket(ipAddr,7800);
        OutputStream out = s.getOutputStream();
        DataOutputStream dos = new DataOutputStream(out);
        dos.writeInt(array.length);
        dos.write(array,0,array.length);
        dos.flush();


        dos.close();
        out.close();
        s.close();
    } 

这是服务器的代码:

void server() {
        ServerSocket ss = null;
        try {
            ss = new ServerSocket(7800);
            DataInputStream dis;
            int len;
            byte[] data;
            Socket s;
            while(true) {
                s = ss.accept();
                InputStream is = s.getInputStream();
                dis = new DataInputStream(is);
                len = dis.readInt();
                data = new byte[len];
                dis.readFully(data,0,data.length);

                photoBitmap = BitmapFactory.decodeByteArray(data,0,data.length);
                img.setImageBitmap(photoBitmap);

                dis.close();
                s.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
每次我试图传输照片时,服务器都会崩溃。
------------------------------------------------
日志目录包括:

    Process: com.example.theminiproject, PID: 15123
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:10554)
        at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:2113)
        at android.view.View.requestLayout(View.java:27069)
        at android.view.View.requestLayout(View.java:27069)
        at android.view.View.requestLayout(View.java:27069)
        at android.view.View.requestLayout(View.java:27069)
        at android.view.View.requestLayout(View.java:27069)
        at android.view.View.requestLayout(View.java:27069)
        at androidx.constraintlayout.widget.ConstraintLayout.requestLayout(ConstraintLayout.java:3239)
        at android.view.View.requestLayout(View.java:27069)
        at android.widget.ImageView.setImageDrawable(ImageView.java:600)
        at androidx.appcompat.widget.AppCompatImageView.setImageDrawable(AppCompatImageView.java:104)
        at android.widget.ImageView.setImageBitmap(ImageView.java:764)
        at androidx.appcompat.widget.AppCompatImageView.setImageBitmap(AppCompatImageView.java:112)
        at com.example.theminiproject.MainActivity2.server(MainActivity2.java:70)
        at com.example.theminiproject.-$$Lambda$jVrGEiH1Ep-S9RdZnfrW_UVFTWs.run(Unknown Source:2)
        at java.lang.Thread.run(Thread.java:923)
2021-03-08 12:24:31.431 15123-15123/? I/ViewRootImpl@867b75a[MainActivity]: stopped(false) old=true
2021-03-08 12:24:31.434 15123-15123/? I/ViewRootImpl@867b75a[MainActivity]: stopped(false) old=false
2021-03-08 12:24:31.441 15123-26157/? I/Process: Sending signal. PID: 15123 SIG: 9
因为我是初学者,所以我一点也不懂。

谢谢。

多亏了评论部分的帮助,我在代码中找到了错误

线程不能更改ImageView,必须创建单独的函数才能更改它

在我的例子中,我创建了一个改变图像的按钮


    public void changePhoto(View v) {
            img.setImageBitmap(photoBitmap);
    }

  • 如果通过线程调用该函数,则照片将更改,但应用程序 将在0.1秒后粉碎

感谢所有帮助您的人。

就套接字方面而言,您的客户端似乎发送了映像数组的长度,然后是映像字节数组本身,服务器接收映像,那么问题出在哪里?如果有问题,请提供具体细节。感谢您的帮助,每次我从客户端发送照片时,服务器都会崩溃。很抱歉,我刚刚开始使用android studio,所以我不太了解它。我编辑了问题,添加了“LogCat”错误,希望它能提供您所需的信息:)。此错误表明您的图像视图只能由创建其实例的线程更改。简单的解决方法是调用UI线程并将图像设置在其范围内。非常感谢您的配合,它工作正常。我真的很感谢你的帮助。