Android最全【Android开发】Android Host详解(翻译自官方文档)(1),2024年最新来一份全面的面试宝典练练手

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图



里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

|- style=“vertical-align:top;”

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;" |

UsbInterface

| style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;” |

代表了一个USB设备的一个接口,该接口定义了一系列关于设备的函数。一个设备在进行“交流”的时候可以有一个或者多个接口。

|- style=“vertical-align:top;”

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;" |

UsbEndpoint

| style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;” |

代表一个接口的接入点,该接入点就是这个接口的通信信道。一个接口可以有一个或者多个这样的接入点,而且一般都是有输入和输出双向通信的接入点。

|- style=“vertical-align:top;”

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;" |

UsbDeviceConnection

| style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;” |

代表该设备的一个连接,用来在接入点上传输数据。这个类允许您能用同步或者异步的方式发送和返回数据。

|- style=“vertical-align:top;”

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;" |

UsbRequest

| style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;” |

在通过UsbDeviceConnection和设备进行“交流”的一个异步请求。

|- style=“vertical-align:top;”

| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;" |

UsbConstants

| style=“border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;” |

关于在linux内核中linux/usb/ch9.h的相关定义的USB常量。

|}

在大多数的情况之下,在和一个USB设备进行“交流”时,上面这些类都需要用到(UsbRequest这个类只有在您做异步通信的时候才会用到)。一般来说,您可以通过查询要操作的UsbDevice来获得一个UsbManager。当您有这个设备时,您需要找到正确的UsbInterface以及和这个接口所对应的UsbEndpoint来进行和设备的“交流”。一旦您获得了正确的接入点,打开UsbDeviceConnection来和该USB设备进行“交流”。

Android中manifest文件的需求

=====================

下面的列表就是描述您应该在用USB主机APIs之前应该在您的应用中的manifest文件中添加些什么:

* 因为不是所有的搭载Android系统的设备都能保证支持USB主机的APIs,不能包含那个声明您的应用使用android.hardware.usb.host的这一元素。

* 设置您的应用的最低的SDK版本在12级或者更高。这个USB主机APIs不在更前面的版本之中。

* 如果您希望您的应用能够被连接的USB设备所提示,只要在您的主activity中在元素对中添加一个元素指向一个额外的XML资源文件,该文件是用来声明验证您希望探测到的设备的验证信息。

在这个XML资源文件中,为您希望过滤的USB设备声明的属性。一般来说,如果您想为一个特定的设备过滤就使用该产品的供应商和产品ID,如果您希望为一组USB设备,例如大量存储设备或者是数码相机来进行过滤那么就应该用类,子类和协议。您可以不指定这些属性,也可以指定所有的属性。不为每个设备指定属性,只有在您的应用需要它时才这么做(这句话翻译的一点问题_):

😗 供应商ID

😗 产品ID

😗 类

😗 子类

😗 协议(设备或者借口)

将您的资源文件保存到元素中指明的那个名字。在下面的例子中是这个XML资源文件的格式。

Manifest文件和资源文件的例子


下面的例子告诉您一个manifest文件以及与它相关资源文件的例子:

1

2

3

4

        <meta-data android:name=“android.hardware.usb.action.USB_DEVICE_ATTACHED”

        android:resource="@xml/device_filter" /&gt;

&lt;/activity&gt;

</application>

在这种情况下,下面的资源文件应该被保存在res/xml/device_filter.xml来确保找到那些特定符合您要求属性的USB设备:

<?xml version"utf-8"?>

用配件工作

=====

当用户将USB配件连接到搭载Android系统的设备上面时,Android系统会判断您的应用是否适用于已连接的该配件。如果适用,您就可以根据您的喜好为该设备建立连接。要这么做,您的应用必须做下面这些动作:

您需要通过一个可以过滤USB设备附加事件的意图过滤器或者枚举已连接的USB设备来发现连接的配件来找到合适的接口。

========================================================

尚未获得许可的用户在适用USB设备操作时需要验证权限。

===========================

通过在接入的端点进行读写数据的操作达到和USB设备交互的目的。

===============================

发现设备


您的应用可以通过两种方式来发现USB设备,一种是用一个意图过滤器在用户连接一个设备时对其进行通知,另一种则是通过枚举您已经连接的所有USB设备。如果您希望您的应用能够自动的探测到你想要的设备,请使用一个意图过滤器来做。但是,如果您希望得到一个已连接设备的列表或者您不希望过滤意图,枚举所有的设备会是一个更好的选择。

使用一个意图过滤器

为了让您的应用可以发现一个特定的USB设备,您可以为android.hardware.usb.action.USB_DEVICE_ATTACHED这个意图指定一个意图来进行过滤。伴随着这个意图过滤器,您需要指定一个资源文件来特别说明这个USB设备的属性,例如供应商和产品ID。当用户连接到一个符合您配件过滤条件的配件时,这个系统会谈出一个对话框询问他们是否希望开始您的应用。如果用户同意,那么您的应用在失去连接之前会自动获取和设备连接的权限。

下面的例子告诉您该如何声明这个意图过滤器:

1

2

<meta-data android:name=“android.hardware.usb.action.USB_DEVICE_ATTACHED”

android:resource="@xml/device_filter" /&gt;

下面的例子告诉您怎么样声明指定您希望连接的USB设备的相关资源文件:

<?xml version"utf-8"?>

在您的activity文件中,您可以从像这样的意图(有附加类的)中获取UsbDevice来代表这个相关的配件:

UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

枚举所有配件

您可以使您的应用在运行时列举出所有能够被识别的USB设备。通过getDeviceList()方法来获得一个包含所有已连接USB配件的数组:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

HashMap deviceList = manager.getDeviceList();

UsbDevice device = deviceList.get(“deviceName”);

如果您喜欢,您也可以一个接一个的从每一个设备的哈希图和过程中获取一个迭代器:

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

HashMap deviceList = manager.getDeviceList();

Iterator deviceIterator = deviceList.values().iterator();

while(deviceIterator.hasNext()){

UsbDevice device = deviceIterator.next()

//your code

}

获得使用一个配件的权限


在您使用一个USB设备前,您的应用必须从用户那里获得权限。

* 注意:* 如果您的应用在连接USB设备时通过一个意图过滤器来发现它们,如果用户允许您的应用来处理这个意图,它将自动接收这个权限。如果用户不允许,那么您就必须在连接设备之前详细在您的应用中写明需要请求的权限。

在某些情况下很有必要明确权限的许可要求,例如当您的应用枚举出所有已经连接的USB设备并且您希望和其中的一个进行“交流”。您必须在和该设备“交流”前检查是否有连接该设备的权限。如果不是这样,您的应用将在用户拒绝您连接该设备的权限之后收到个运行错误。

为了确切地获得权限,首先需要创建个广播接收器。这个接收器在您调用requestPermission()这个方法时从您得到的广播中监听这个意图。通过调用requestPermission()这个方法为用户跳出一个是否连接该设备的对话框。下面的例子告诉您如何创建一个广播接收器:

private static final String ACTION_USB_PERMISSION =

“com.android.example.USB_PERMISSION”;

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (ACTION_USB_PERMISSION.equals(action)) {

    synchronized (this) {

        UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);



        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {

            if(device != null){

              //call method to set up device communication

           }

        } 

        else {

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

另外,描述问题一定要慢!不要一下子讲一大堆,慢显得你沉稳、自信,而且你还有时间反应思路接下来怎么讲更好。现在开发过多依赖ide,所以会有个弊端,当我们在面试讲解很容易不知道某个方法怎么读,这是一个硬伤…所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音+沉稳的描述+好听的嗓音决对是一个加分项!

最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。

希望大家都能找到合适自己满意的工作!

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题** (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-ah9Pn8P5-1715235959416)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值