我的意图是空的,但我应该从我的广播接收器获得意图

问题描述 投票:0回答:1

我是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;
    }
}

android broadcastreceiver usb
1个回答
0
投票

PendingIntent.FLAG_IMMUTABLE
应该是
PendingIntent.FLAG_MUTABLE

© www.soinside.com 2019 - 2024. All rights reserved.