Android usb 配件模式通信示例

这篇具有很好参考价值的文章主要介绍了Android usb 配件模式通信示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当使用 Android 设备作为 USB 配件时,可以使用 Android 提供的 USB Accessory API 来进行 USB 通信。以下是一个简单的 Android USB 配件模式的通信例子。在本例中,我们将接收连接到 Android 设备的 USB 主机发送的数据并向 USB 主机发送响应。

首先,在 AndroidManifest.xml 文件中添加以下权限:

<uses-feature android:name="android.hardware.usb.accessory" />
<uses-permission android:name="android.permission.ACCESSORY" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

接着,在 res/xml 文件夹中创建一个名为 accessory_filter.xml 的文件,用于指定 USB 配件的属性及其应用程序的信息。以下是示例文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-accessory model="Android Accessory" manufacturer="Android" version="1.0" />
</resources>

在 Activity 中,添加以下代码:

private static final String TAG = "USBAccessoryDemo";

private static final String ACTION_USB_PERMISSION = "com.example.android.usbaccessory.USB_PERMISSION";
private static final int TIMEOUT = 1000;
private static final int MAX_PACKET_SIZE = 16384;

private UsbAccessory mAccessory;
private UsbManager mUsbManager;
private PendingIntent mPermissionIntent;
private boolean mPermissionRequestPending;
private UsbAccessoryConnection mAccessoryConnection;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(mUsbReceiver, filter);

    HashMap<String, UsbAccessory> accessoryList = mUsbManager.getAccessoryList();
    if (accessoryList != null) {
        UsbAccessory accessory = accessoryList.get(0);
        if (accessory != null) {
            if (mUsbManager.hasPermission(accessory)) {
                openAccessory(accessory);
            } else {
                mUsbManager.requestPermission(accessory, mPermissionIntent);
                mPermissionRequestPending = true;
            }
        } else {
            Log.d(TAG, "accessory is null");
        }
    } else {
        Log.d(TAG, "accessoryList is null");
    }
}

@Override
public void onResume() {
    super.onResume();
    if (mAccessoryConnection != null && mAccessoryConnection.isOpen()) {
        mAccessoryConnection.startReading();
    }
}

@Override
public void onPause() {
    super.onPause();
    if (mAccessoryConnection != null && mAccessoryConnection.isOpen()) {
        mAccessoryConnection.stopReading();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mUsbReceiver);
    if (mAccessoryConnection != null && mAccessoryConnection.isOpen()) {
        mAccessoryConnection.close();
    }
}

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    openAccessory(accessory);
                } else {
                    Log.d(TAG, "permission denied for accessory " + accessory);
                }
                mPermissionRequestPending = false;
            }
        }
    }
};

private void openAccessory(UsbAccessory accessory) {
    mAccessoryConnection = new UsbAccessoryConnection(this, accessory);
    mAccessoryConnection.open();
}

private class UsbAccessoryConnection implements Runnable {
    private final UsbManager mUsbManager;
    private final UsbAccessory mAccessory;
    private ParcelFileDescriptor mConnection;
    private UsbEndpoint mInEndpoint;
    private UsbEndpoint mOutEndpoint;
    private InputStream mInputStream;
    private OutputStream mOutputStream;
    private Thread mReadThread;
    private boolean mIsRunning;

    public UsbAccessoryConnection(Context context, UsbAccessory accessory) {
        mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
        mAccessory = accessory;
    }

    public void open() {
        Connection = mUsbManager.openAccessory(mAccessory);
            if (mConnection != null) {
                FileDescriptor fd = mConnection.getFileDescriptor();
                mInputStream = new FileInputStream(fd);
                mOutputStream = new FileOutputStream(fd);
                mIsRunning = true;
                mReadThread = new Thread(this);
                mReadThread.start();
            } else {
                Log.d(TAG, "openAccessory failed");
            }
    }

    public void close() {
        mIsRunning = false;
        if (mReadThread != null) {
            try {
                mReadThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if (mInputStream != null) {
            try {
                mInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (mOutputStream != null) {
            try {
                mOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (mConnection != null) {
        try {
                mConnection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
    }

    public boolean isOpen() {
        return mConnection != null;
    }

    public void startReading() {
        if (mReadThread != null && !mReadThread.isAlive()) {
            mIsRunning = true;
            mReadThread = new Thread(this);
            mReadThread.start();
        }
    }

    public void stopReading() {
        mIsRunning = false;
    }

    public void write(byte[] data) {
        if (mOutputStream != null) {
            try {
                mOutputStream.write(data);
                mOutputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void run() {
        byte[] buffer = new byte[MAX_PACKET_SIZE];
        while (mIsRunning) {
            try {
                int len = mInputStream.read(buffer);
                if (len > 0) {
                    final String receivedData = new String(buffer, 0, len);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // 处理接收到的数据
                        }
                    });
                }
            } catch (IOException e) {
                e.printStackTrace();
                mIsRunning = false;
            }
        }
    }
}

在上面的代码中,我们首先检查是否已连接 USB 配件。如果已连接,则尝试打开连接。如果没有权限,则请求权限。如果没有可用的 USB 配件,则在日志中记录错误消息。

在打开连接后,我们创建一个 UsbAccessoryConnection 对象,并使用 open() 方法打开连接。在 open() 方法中,我们获取连接的 UsbDeviceConnection 对象,并使用它来获取读取和写入数据的输入/输出流。我们还启动了一个读线程,该线程不断地从输入流中读取数据,并将其传递给主线程以进行处理。

最后,我们可以使用 write() 方法向 USB 主机发送数据,并使用 close() 方法关闭连接。

以上就是Android usb 配件模式下的示例,在实际的开发过程中会比较复杂,但原理基本类似。如果文档对你有帮助,欢迎点赞、收藏和评论,谢谢!文章来源地址https://www.toymoban.com/news/detail-618337.html

到了这里,关于Android usb 配件模式通信示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android车载系列】第8章 车载通信-USB协议代码实现

      上一篇已经简单介绍了USB协议的相关知识,其中的描述符较为重要,描述符成功返回,USB通信已经成功了一大半,具体描述符的知识点可以翻阅上一篇来了解。下面我们来看一下USB协议在的分层。   USB协议用的地方非常多,比如U盘、麦克风、充电器等等。其中传输、

    2023年04月08日
    浏览(52)
  • Flutter:如何在Android中实现USB转串口通信调试

            本文介绍如何通过flutter_usb_serial插件在Flutter中实现USB转串口通信调试。 1、引入依赖         在flutter工程的pubspec.yaml文件中引入flutter_usb_serial依赖: 2、导入import依赖包         在dart代码中import导入usb_serial/usb_serial.dart就可以使用了。 3、读取所有USB口设备    

    2024年02月14日
    浏览(37)
  • 【Android取证篇】Android设备USB调试打开方式(开发者模式)

    Android各个版本系统手机开启”USB调试”的入口不全相同,仅供参考—【蘇小沐】 1、【Android1.0-3.2】 路径:在应用列表选择「设置」-「应用程序」-「开发」-勾选「USB调试」选项。 2、【Android 4.0、4.1】 路径:在应用程序列表中选择「设置」进入系统设置菜单-「开发者选项」

    2024年02月14日
    浏览(50)
  • 通过usb利用adb实现android手机和pc机通信

    1、 adb forward 原理概述 adb forward 的功能是建立一个转发 如:adb forward tcp:8000 tcp:9000 的意思是,将PC端的 8000 端口收到的数据,转发给手机中的 9000 端口。 但是光执行这个命令还不能转发数据,还需要完成下面两个步骤才能传数据: (a)在手机端,建立一个端口为9000的 serv

    2024年01月22日
    浏览(45)
  • Android11编译第二弹:USB连接MTP模式+USB调试+USB信任

    问题1:原始的AOSP,如果通过USB连接设备以后,会弹窗提示用户选择连接模式:MTP,大容量磁盘,照片等模式; 问题2:USB连接设备以后,需要开启USB调试模式,才方便操作adb调试; 问题3:USB设备连接以后,电脑会弹窗是否信任设备,需要点击信任当前设备,否则设备连接不

    2024年02月10日
    浏览(50)
  • android 12.0USB连接模式默认设为MTP

    在12.0android系统产品开发中,UsbManager调用接口,会binder通信到UsbService。而UsbService又有两个实例,一个 UsbHostManager,一个UsbDeviceManager。UsbDeviceManager和 UsbHostManager是一个相对的概念, UsbHostManager是手机作为一个host,比如键盘、鼠标通过usb连接手机。而UsbDeviceManager是手机与电脑

    2024年02月09日
    浏览(56)
  • 《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(54)
  • Android 9.0 禁止usb键盘和usb鼠标挂载

    在9.0的系统产品开发中,对于系统中usb鼠标和usb键盘的等外设输入设备挂载处理,系统是在inputflinger模块中处理的,在产品的需求中对于外设输入设备的usb鼠标和usb键盘的挂载是禁用的,所以需要从挂载入手,禁止挂载usb鼠标和usb键盘 在android系统中是由各个子系统分工协作

    2024年02月09日
    浏览(44)
  • 【干货】Android系统定制基础篇:第三部分(Android静默安装、Android支持usb打印机)

    一些产品要求APP在升级时能够实现静默安装,而无需弹出安装界面让用户确认。这里提出两种实现方案: 方案一 APP调用『pm』命令实现静默安装,此方案无须修改Android源码,但需要root权限。 方案二 修改Android PackageInstaller 源码,增加Intent参数来指定是否要静默安装,同时支

    2024年02月10日
    浏览(47)
  • Android 12.0 通过驱动实现禁用usb鼠标和usb键盘功能

    在12.0的系统产品定制化开发中,在进行定制中有关于usb键盘和usb鼠标的需求中,产品要求禁止usb口挂载usb鼠标和usb键盘,所以需要要求在usb挂载类型的时候 判断如果是usb鼠标和usb键盘就不让挂载,这就需要从驱动方面入手来解决这个问题,接下来看下驱动的某些挂载usb的相

    2024年02月08日
    浏览(106)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包