Python - почему не работает отправитель камеры для Android? - PullRequest
0 голосов
/ 01 февраля 2020

Я просто хочу позвонить отправителю камеры для проекта. Я использую buildozer для конвертирования файла python kivy в «.apk». Но он не работает на телефоне Android.

Это файл сервера на P C

from threading import Thread
from time import sleep
import clss as cl
import socket
from time import sleep
import cv2
import io
import socket
import struct
import time
import pickle
import zlib
import sys
import numpy as np
UDP_IP = '192.168.1.100'
UDP_PORT = 6666 #20,21

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDPcmd
sock.bind((UDP_IP, UDP_PORT))

HOST=''
PORT=6666

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')

s.bind((HOST,PORT))
def threaded_function(arg):
    while True:
        try:

            print('Socket bind complete')
            s.listen()
            print('Socket now listening')

            conn,addr=s.accept()

            data = b""
            payload_size = struct.calcsize(">L")
            print("payload_size: {}".format(payload_size))
            while True:
                while len(data) < payload_size:
                    print("Recv: {}".format(len(data)))
                    data += conn.recv(4096)
                    if len(data)==0:
                        break

                print("Done Recv: {}".format(len(data)))
                packed_msg_size = data[:payload_size]
                data = data[payload_size:]
                msg_size = struct.unpack(">L", packed_msg_size)[0]
                print("msg_size: {}".format(msg_size))
                while len(data) < msg_size:
                    data += conn.recv(4096)
                frame_data = data[:msg_size]
                data = data[msg_size:]

                frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
                frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
                cv2.imshow('ImageWindow',frame)
                cv2.waitKey(1)
        except:
            print("Error")

def threaded_function2(arg):
    while True:
        print("your server two is working congrats")
        data, addr = sock.recvfrom(1024) # Buffer size is 1024 bytes
        print ("received message:", data,addr)


if __name__ == "__main__":
    thread = Thread(target = threaded_function, args = (10, ))
    thread2 = Thread(target = threaded_function2, args = (10, ))

    thread.start()
    thread2.start()
    thread.join()
    print("thread finished...exiting")

Отправитель .apk на Android

import clss as cl
import cv2
import pickle
import struct

import socket
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput


UDP_IP = "192.168.1.100"
UDP_PORT = 6666



anaDuzen = BoxLayout(orientation = "vertical") # Elemanların hepsini tutan ana pencere düzenimiz
ikinci_Duzen = BoxLayout(orientation = "vertical")

ilkSatir = BoxLayout()
ikinciSatir = BoxLayout()
ucuncuSatir = BoxLayout()
dorduncuSatir = BoxLayout()




ip_txt=TextInput()
textdeneme=TextInput()
take_port_number=TextInput()
label_for_ip=Label(text='IP Adresi:')
label_for_port=Label(text='Port Numarası:')
doldurLabel2=Label()
doldurLabel=Label()

ileri_Button=Button(text = "İleri")
geri_Button=Button(text = "Geri")
sag_button=Button(text = "Sag")
sol_button=Button(text = "Sol")

def kameraSender():

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('192.168.1.100', 6666))
    connection = client_socket.makefile('wb')

    cam = cv2.VideoCapture(0)

    cam.set(3, 320);
    cam.set(4, 240);

    img_counter = 0

    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]

    while True:
        ret, frame = cam.read()
        result, frame = cv2.imencode('.jpg', frame, encode_param)
    #    data = zlib.compress(pickle.dumps(frame, 0))
        data = pickle.dumps(frame, 0)
        size = len(data)


        client_socket.sendall(struct.pack(">L", size) + data)
        img_counter += 1


    cam.release()


def ileriGit(instance):
    kameraSender()

def geriGit(instance):
    pass

def sagaGit(instance):
    #print("Hello")
    MESSAGE="sag"

    try:
        sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        sock.sendto(str.encode(MESSAGE),(UDP_IP,UDP_PORT))
    except:
        pass

def solaGit(instance):
    #print("Hello")
    MESSAGE="sol"

    try:
        sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        sock.sendto(str.encode(MESSAGE),(UDP_IP,UDP_PORT))
    except:
        pass




ileri_Button.bind(on_press = ileriGit)
geri_Button.bind(on_press = geriGit)
sag_button.bind(on_press = sagaGit)
sol_button.bind(on_press = solaGit)

# Ens on denenen kod burada
#geri_Button.bind(on_press=onur)
class Program(App):

    def build(self):

        #İLK SATIR
        ilkSatir.add_widget(label_for_ip)
        ilkSatir.add_widget(ip_txt)

        #İKİNCİ SATIR
        ikinciSatir.add_widget(label_for_port)
        ikinciSatir.add_widget(take_port_number)

        ucuncuSatir.add_widget(doldurLabel)
        ucuncuSatir.add_widget(ileri_Button)
        ucuncuSatir.add_widget(doldurLabel2)
        dorduncuSatir.add_widget(sol_button)
        dorduncuSatir.add_widget(geri_Button)
        dorduncuSatir.add_widget(sag_button)

        anaDuzen.add_widget(ilkSatir)
        anaDuzen.add_widget(ikinciSatir)
        anaDuzen.add_widget(ucuncuSatir)
        anaDuzen.add_widget(dorduncuSatir)

        return anaDuzen


obj=Program()
obj.run()

Когда я пытаюсь открыть это приложение .apk, мой .apk просто закрывается на телефоне. Это не дает ошибку. Это просто закрытие. Эта проблема не о buildozer.spe c Я думаю. Потому что я даю разрешение с "android .permissinons = INTE RNET, КАМЕРА", как это. Нет синтаксической ошибки. Эти файлы работают на p c правильно. Нужно ли давать другое разрешение для разрешения Android камеры? Что мне не хватает Спасибо.

...