我正在尝试构建一个简单的 GUI,包括一个二维码读取器,以便使用 Ubuntu 上的 Python 将数据发送到远程服务器,用于学校项目。我已经设置了一个简单的服务器来接收来自 sca 的消息...
我正在尝试构建一个简单的 GUI,包括一个二维码读取器,以便使用 Ubuntu 上的 Python 将数据发送到远程服务器,用于学校项目。我已经设置了一个简单的服务器,通过 tcp/ip 接收来自扫描仪的消息:
import socket
from Crypto.Cipher import AES
def main():
# Server mit gegebener Adresse starten
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("192.168.1.40", 9999))
server.listen()
while True:
client, address = server.accept()
msg = client.recv(1024).decode('ASCII')
print(msg)
if __name__ == '__main__':
main()
如果我运行一个简单的测试客户端,所有消息都会被收到:
import socket
client = socket.socket()
try:
client.connect(("192.168.1.40",9999))
for i in range(1,10):
client.send("\nHallo Server, ich bin dein Client und will was\n".encode('ASCII'))
except:
print("Server nicht verfügbar\n\n")
我在服务器上逐行打印了 9 条消息。
实际的 GUI 是
import PySimpleGUI as sg
from pyzbar import pyzbar
import cv2
import os
import socket
import math
from time import time, sleep
from Crypto.Cipher import AES
H1 = 0
def read_qr():
vid = cv2.VideoCapture(0)
qr = False
while(not qr):
ret, frame = vid.read()
qr = pyzbar.decode(frame)
duration = .1
freq = 3000
os.system('play -nq -t alsa synth {} sine {}'.format(duration,freq))
qr = qr[0].data.decode().split(':::')
vid.release()
cv2.destroyAllWindows()
return qr
def si_msg(body):
global H1
H1 += 1
H2 = socket.gethostname().split('-')[2]
H3 = 0
H5, H4 = math.modf(time())
H6 = 2
H7 = len(body.encode('ASCII'))
si_msg = " ".join([str(H1), H2, str(H3), str(int(H4)), str(int(H5*10**8)), str(H6), str(H7), body])
return si_msg
def main():
sg.theme('PythonPlus')
status = 'Verbindung getrennt'
socket.setdefaulttimeout(2.5)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
layout = [ [sg.Text('Server-Adresse:'),sg.Input(key = 'k_server', default_text='192.168.1.40:9999')],
[sg.Button('Server bestätigen')],
[sg.Text('Status:'), sg.Text(status, key = 'k_status')],
[sg.Exit()]]
window = sg.Window('Virtueller Login', layout)
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Exit':
break
elif event == 'Server bestätigen':
status = 'Verbindung zum Server wird hergestellt'
window['k_status'].update(status)
server = values['k_server'].split(':')
try:
client.connect((server[0],int(server[1])))
status = 'Verbindung hergestellt: ausgeloggt'
window['k_status'].update(status)
except:
status = 'Verbindungsversuch fehlgeschlagen'
window['k_status'].update(status)
sg.popup('FEHLER: Server nicht gefunden. Bitte prüfen Sie die Adresse oder wenden Sie sich an den Administrator')
continue
window.start_thread(lambda: read_qr(), 'Code gefunden')
if event == 'Code gefunden':
qr = values[event][0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
sleep(2)
client.close()
window.close()
if __name__ == '__main__':
main()
运行此主程序使我能够扫描二维码/条形码,该二维码/条形码已成功包装在标题中(我必须制作这个丑陋的东西)并在每次扫描时打印, H1
每次扫描时迭代扫描计数器。我在客户端或服务器上没有收到任何错误,但服务器只收到第一次扫描。
为了确保它与 pysimplegui 处理的多线程无关,我省略了以下行
window.start_thread(lambda: read_qr(), 'Code gefunden')
if event == 'Code gefunden':
qr = values[event][0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
sleep(2)
并用直接扫描命令替换它们(冻结 GUI):
qr = read_qr()[0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
这样我就可以启用连接、扫描代码、发送消息,然后循环似乎停止工作,我无法再扫描。我可以再次按下 GUI 的连接按钮,从而“重新连接”到服务器(从未断开连接?)再次扫描,但它不会向服务器发送消息,也不会第三次建立连接。
或者,简单地手动添加第二条消息也无法发送,这也不起作用:
qr = read_qr()[0]
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
sleep(0.5)
msg = si_msg(qr)
print(msg)
client.send(msg.encode('ASCII'))
计数器迭代并打印,但没有发送第二条消息,连接似乎丢失,我可以重新连接,再次扫描(不发送任何消息),就是这样,再也没有第三次机会。
由于我没有收到任何错误,我对此有些困惑。我认为这与 pysimplegui 无关,因为连续的手动消息也没有发送,但我不知道,并乐意提供任何帮助...
我目前正在制作一款 Android 游戏,该游戏将使用 Google Play Games 进行云保存。我已下载 Google Play Games SDK 并将其添加到 Unity,然后按照 Unity 的教程进行登录...
我目前正在制作一款 Android 游戏,该游戏将使用 Google Play 游戏进行云保存。我已下载 Google Play 游戏 SDK 并将其添加到 Unity,并按照 Unity 的教程进行登录( https://docs.unity.com/ugs/manual/authentication/manual/platform-signin-google-play-games )。我已按照不同的步骤进行设置(为 Android 和 Web 添加了 OAuth,将自己添加为测试人员,并在我的设备上进行了测试),但似乎无法使其正常工作。经过一些调试后,我意识到问题出在这行代码上 PlayGamesPlatform.Activate();
以下是代码片段。我只包含了调用它的 void,以避免代码淹没该消息,但如果需要,我愿意分享更多代码。此 void 在 Start() 处被调用。
void initialLogIn()
{
debugText.text += "Begin Log In | ";
//Initialize PlayGamesPlatform
PlayGamesPlatform.Activate();
PlayGamesPlatform.DebugLogEnabled = true;
debugText.text += "Activate Play Games Platform | ";
LoginGooglePlayGames();
}
我希望在游戏加载时玩家可以自动登录他们的 Google Play 帐户,但是不会出现登录原生弹出窗口。
我运行了 Android LogCat 并注意到出现了以下错误:
2024-07-21 22:41:25.959 23612 23673 Error Unity AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.games.PlayGames
2024-07-21 22:41:25.959 23612 23673 Error Unity java.lang.ClassNotFoundException: com.google.android.gms.games.PlayGames
2024-07-21 22:41:25.959 23612 23673 Error Unity at java.lang.Class.classForName(Native Method)
2024-07-21 22:41:25.959 23612 23673 Error Unity at java.lang.Class.forName(Class.java:536)
2024-07-21 22:41:25.959 23612 23673 Error Unity Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.games.PlayGames" on path: DexPathList[[zip file "/data/app/~~kEIMtZEHFF7OzIloMOW6LQ==/com.barkunjgames.dressipher-j24w2j_UTad-VS-G0swCrA==/base.apk"],nativeLibraryDirectories=[/data/app/~~kEIMtZEHFF7OzIloMOW6LQ==/com.barkunjgames.dressipher-j24w2j_UTad-VS-G0swCrA==/lib/arm64, /data/app/~~kEIMtZEHFF7OzIloMOW6LQ==/com.barkunjgames.dressipher-j24w2j_UTad-VS-G0swCrA==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]
2024-07-21 22:41:25.959 23612 23673 Error Unity at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
2024-07-21 22:41:25.959 23612 23673 Error Unity at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
2024-07-21 22:41:25.959 23612 23673 Error Unity at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
2024-07-21 22:41:25.959 23612 23673 Error Unity ... 2 more
2024-07-21 22:41:25.959 23612 23673 Error Unity at UnityEngine.AndroidJNISafe.CheckExceptio
并且早些时候在 logcat 中出现了这个错误:
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 ERROR: Format allocation info not found for format: 3b
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 ERROR: Format allocation info not found for format: 0
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 Invalid base format! req_base_format = (<unrecognized format> 0x0), req_format = (<unrecognized format> 0x3b), type = 0x0
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 ERROR: Unrecognized and/or unsupported format (<unrecognized format> 0x3b) and usage (CPU_READ_NEVER|CPU_WRITE_NEVER|GPU_TEXTURE|GPU_RENDER_TARGET|COMPOSER_OVERLAY 0xb00)
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 ERROR: Format allocation info not found for format: 3b
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 ERROR: Format allocation info not found for format: 0
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 Invalid base format! req_base_format = (<unrecognized format> 0x0), req_format = (<unrecognized format> 0x3b), type = 0x0
2024-07-21 22:41:23.171 23612 23673 Error gralloc4 ERROR: Unrecognized and/or unsupported format (<unrecognized format> 0x3b) and usage (CPU_READ_NEVER|CPU_WRITE_NEVER|GPU_TEXTURE|GPU_RENDER_TARGET|COMPOSER_OVERLAY 0xb00)
我尝试过的一些步骤包括:• 查看其他 Google 登录教程,看看我是否遗漏了任何步骤,或者登录是否可以与不同的代码一起使用• 在 Google 上查找解决此问题的不同方法(尝试了此评论建议的方法: https://github.com/playgameservices/play-games-plugin-for-unity/issues/3154#issuecomment-1293257681 )• 尝试在移动依赖解析器/外部依赖解析器中使用强制解析• 联系了一些程序员朋友
我的问题是如何解决 AndroidJavaException :java.lang.ClassNotFoundException:com.google.android.gms.games.PlayGames 问题 并允许玩家使用他们的 Google Play 帐户登录?
如果不可能,那么您还有其他解决方案可以让我允许云保存吗?
我尝试在游戏开始时弹出 Google Play 登录窗口,但什么也没发生。我在 logcat 上收到一条消息,内容是 AndroidJavaException:java.lang.ClassNotFoundException:com.google.android.gms.games.PlayGames