android - 将图像从 Python 发送到 Android 手机
问题描述
我有一个关于安卓手机和电脑之间的蓝牙通信的问题。首先,我想将图像从 PC 发送到 Android 手机。
让我展示我的代码 Android 端
处理程序:
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch(msg.what){
case STATE_LISTENING:
status.setText("LISTENING");
break;
case STATE_CONNECTING:
status.setText("Connecting");
break;
case STATE_CONNECTED:
status.setText("Connected");
break;
case STATE_CONNECTION_FAILED:
status.setText("Connection Failed");
break;
case STATE_MESSAGE_RECEIVED:
byte[] readBuff = (byte[]) msg.obj;
Bitmap bitmap = BitmapFactory.decodeByteArray(readBuff,0,msg.arg1);
imageView.setImageBitmap(bitmap);
break;
}
return true;
}
});
发送接收类:
public class SendReceive extends Thread{
private final BluetoothSocket bluetoothSocket;
private final Handler _handler;
private final InputStream inputStream;
private final OutputStream outputStream;
public SendReceive(BluetoothSocket socket, Handler handler){
bluetoothSocket = socket;
InputStream tempIn = null;
OutputStream tempOut = null;
_handler = handler;
try {
tempIn = bluetoothSocket.getInputStream();
tempOut = bluetoothSocket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
inputStream = tempIn;
outputStream = tempOut;
}
public void run(){
byte[] buffer = null;
int numberOfBytes = 0;
int index = 0;
boolean flag = true;
while(true){
if(flag){
try {
byte[] temp = new byte[inputStream.available()];
if(inputStream.read(temp)>0){
numberOfBytes = Integer.parseInt(new String(temp,"UTF-8"));
buffer = new byte[numberOfBytes];
flag = false;
}
} catch (IOException e) {
e.printStackTrace();
}
}else{
try {
byte[] data = new byte[inputStream.available()];
int numbers = inputStream.read(data);
System.arraycopy(data,0,buffer,index,numbers);
index = index+numbers;
if(index == numberOfBytes){
_handler.obtainMessage(MainActivity.STATE_MESSAGE_RECEIVED, numberOfBytes,-1,buffer).sendToTarget();
flag = true;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void write(byte[] bytes){
try {
outputStream.write(bytes);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
Python代码:
#!/usr/bin/python
import bluetooth
from PIL import Image
im = Image.open('MyImage.png')
im_resize = im.resize((500, 500))
buf = io.BytesIO()
im_resize.save(buf, format='PNG')
byte_im = buf.getvalue()
def connect (bd_addr,port,message):
sock=bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr, port))
sock.send(message)
sock.close()
addr = "XX:XX:XX:XX"
services = bluetooth.find_service(address=addr)
for svc in services:
if svc["name"] == b'BluetoothProject\x00': #Name of Android Project
connect(addr,svc["port"], byte_im)
else:
print("Bluetooth is offline or smth else")
我可以毫无问题地发送短信,但无法发送图像。错误在 Android 端:java.lang.NumberFormatException:对于输入字符串。它不能将字符串转换为 int(SendRecieve 类,numberOfBytes = Integer.parseInt(new String(temp,"UTF-8"))。
我应该如何从 python 端发送图像和哪种格式?什么是正确的方法?
而且我还尝试以 base64 格式发送。然后,错误是“bad-base 64”和 numberofbytes 行。你能帮我解决我的问题吗?谢谢。!!
解决方案
推荐阅读
- php - 如何删除多步变量会话数组
- azure-sql-database - 将 Microsoft Forms 数据写入 Azure SQL
- solr - 为 Open Documents 索引 last_modified 字段的问题
- powershell - 在 Where-Object 语句中添加多个子句
- java - 使用 Selenium Webdriver 从网站下载文件时出现问题
- awk - 替换相同范围内的数字
- python - 当我执行 print(True) 时,打印的值算作字符串还是布尔值?
- laravel - 使用 HasManyThrough 在 null 上调用成员函数 where()
- c# - Linq 在错误的模式中查询正确的表
- javascript - 调用 document.getSelection() 时,Microsoft Edge 返回的值与 Chrome 不同