我是android开发新手,我在这个问题上挣扎了一段时间,如果你能帮助我,那就太好了。 :)
我尝试构建一个应用程序,可以在手机(它是主机)和 Arduino 板之间传输数据。我很难识别我的 USBDevice。我的手机上询问我是否要授予权限。但我无法继续,因为来自接收器的意图为空,然后我尝试写入 usbConnection 类中的 usbDevice 的意图当然也为空。我与 Google 的官方文档合作。
这是我的主要活动
package com.example.maturaproject02;
import static com.example.maturaproject02.UsbConnection.ACTION_USB_PERMISSION;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity {
UsbConnection usbConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
usbConnection = new UsbConnection(this);
} catch (noUsbDeviceException e) {
throw new RuntimeException(e);
}
// Initialisierung des BroadcastReceivers
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
this.registerReceiver(usbReceiver, filter);
// Initialisierung der RecyclerView
RecyclerView recyclerView = findViewById(R.id.rvChatItems);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// Hinzufügen des ItemDecorators
int verticalSpacing = 1; // Sie können den Wert ändern, um den Abstand zu erhöhen oder zu verringern
VerticalSpacingItemDecorator itemDecorator = new VerticalSpacingItemDecorator(verticalSpacing);
recyclerView.addItemDecoration(itemDecorator);
// Setzen des Adapters
ContactAdapter contactAdapter = new ContactAdapter(this);
recyclerView.setAdapter(contactAdapter);
FloatingActionButton addContactButton = findViewById(R.id.addContactButton);
addContactButton.setOnClickListener(v -> {
View view1 = LayoutInflater.from(this).inflate(R.layout.input_name_layout, null);
EditText newName = view1.findViewById(R.id.newName);
AlertDialog alertDialog = new MaterialAlertDialogBuilder(this)
.setTitle("Kontakt benennen")
.setView(view1)
.setPositiveButton("OK", (dialog, which) -> {
String name = newName.getText().toString();
View view2 = LayoutInflater.from(this).inflate(R.layout.input_id_layout, null);
EditText newID = view2.findViewById(R.id.newID);
AlertDialog alertDialog2 = new MaterialAlertDialogBuilder(this)
.setTitle("ID setzen")
.setView(view2)
.setPositiveButton("OK", (dialog2, which2) -> {
int id = Integer.parseInt(newID.getText().toString());
Contact newContact = new Contact(name, id, new ArrayList<String>());
contactAdapter.addContact(newContact);
})
.setNegativeButton("Abbrechen", null)
.create();
alertDialog2.show();
})
.setNegativeButton("Abbrechen", null)
.create();
alertDialog.show();
});
}
private static final String TAG = "UsbConnection";
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
Toast.makeText(context, "111111111111111111111111111", Toast.LENGTH_SHORT).show();
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
usbConnection.setDeviceIntent(intent);
if (usbConnection.getDeviceIntent() == null) {
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
Toast.makeText(context, "2222222222222222222222222222222222", Toast.LENGTH_SHORT).show();
if (device != null) {
Toast.makeText(context, "33333333333333333333333333333" + device, Toast.LENGTH_SHORT).show();
usbConnection.setDeviceIntent(intent);
}
} else {
Toast.makeText(context, "permission denied for device " + device, Toast.LENGTH_SHORT).show();
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
}
};
}
这是我的 usbConnection 类,也许有帮助:
package com.example.maturaproject02;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;
//import com.hoho.*;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
public class UsbConnection {
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
public static final String ACTION_USB_PERMISSION = "com.example.maturaproject02.USB_PERMISSION";
private UsbManager usbManager;
private UsbDevice usbDevice;
private UsbDeviceConnection usbDeviceConnection;
private UsbInterface usbInterface;
private UsbEndpoint usbEndpointIn;
private UsbEndpoint usbEndpointOut;
private PendingIntent permissionIntent;
private Intent deviceIntent;
private boolean messageSent = false;
public UsbConnection(Context context) throws noUsbDeviceException {
permissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE); //vielleicht auch PendingIntent.FLAG_MUTABLE lt gpt muss ab API 31 einer der beiden werte bei pending intent sein
usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
if(!deviceList.isEmpty())
usbDevice = deviceList.values().iterator().next();
if(usbDevice != null) {
usbManager.requestPermission(usbDevice, permissionIntent); //maybe usbDevice is not a usbAccessory
} else {
Toast.makeText(context, "No USB device found", Toast.LENGTH_SHORT).show();
}
if (deviceIntent == null) {
Toast.makeText(context, "intent is null", Toast.LENGTH_SHORT).show();
messageSent = true;
} else {
usbDevice = deviceIntent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (usbDevice == null && !messageSent) {
Toast.makeText(context, "No USB device found", Toast.LENGTH_SHORT).show();
messageSent = true;
}
usbDeviceConnection = usbManager.openDevice(usbDevice);
if (usbDeviceConnection == null && !messageSent) {
Toast.makeText(context, "No USB device connection found", Toast.LENGTH_SHORT).show();
messageSent = true;
}
usbInterface = usbDevice.getInterface(0);
if (usbDevice == null && !messageSent) {
Toast.makeText(context, "No USB device found", Toast.LENGTH_SHORT).show();
messageSent = true;
}
for(int i = 0; i < usbInterface.getEndpointCount(); i++) {
UsbEndpoint endpoint = usbInterface.getEndpoint(i);
if(endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
usbEndpointIn = endpoint;
} else {
usbEndpointOut = endpoint;
}
}
}
if(!messageSent)
Toast.makeText(context, "FINISHED CONSTRUCTORS WITHOUT ERRORS", Toast.LENGTH_SHORT).show();
}
public void write(String message) {
if(usbDeviceConnection != null) {
usbDeviceConnection.bulkTransfer(usbEndpointOut, message.getBytes(), message.length(), 1000);
}
}
public byte[] read() {
byte[] bytes = new byte[usbEndpointIn.getMaxPacketSize()];
if(usbDeviceConnection != null) {
usbDeviceConnection.bulkTransfer(usbEndpointIn, bytes, bytes.length, 1000);
}
return bytes;
}
public void setDeviceIntent(Intent deviceIntent) {
this.deviceIntent = deviceIntent;
}
public Intent getDeviceIntent() {
return deviceIntent;
}
}
PendingIntent.FLAG_IMMUTABLE
应该是PendingIntent.FLAG_MUTABLE