原文链接:http://android.eoe.cn/topic/android_sdk

2012年的Android辅助设备开发工具包(ADK)是Android开放设备协议(AOA)设备的最新参考实现,它被用于帮助Android硬件辅助设备开发者
和软件开发者开发制造Android辅助设备。ADK2012基于Arduino开源电子产品原型设计平台,并增加了一些软硬件方面的扩展,而这些扩展能够使该工具包开发的产品与Android设备进行通信。

在2012年的Google I/O开发者大会上只有数量很少的工具包被发行。如果你没有得到其中的一个工具包,不要着急,关于硬件的规范和设计文件将由生产商和业余爱好者发布。你将看到有相似功能的工具包,你可以通过购买得到它们,当然你也可以自己开发一套工具包。

这个ADK中一个重要的新功能是你可以通过USB连接播放音频文件。如果你对在Android平台上开发与音频相关的USB辅助设备感兴趣,请确定这个
ADK中包含了对USB音频扩展坞的参考实现。

组件

ADK2012基于Arduino开源电子产品原型设计平台,同时也是开放的硬件设计。其硬件设计文件和固件源代码包含在了下载的ADK软件包中。
此ADK包含了两个重要的物理硬件组件:

1.主板包括了微处理器,USB连接,电源接口和输入输出针口。这个主板可以被移除然后独立于余下的硬件单独使用。

2.屏蔽传感器,发光二极管(LED),输入控制,音频放大器和扬声器输出,把它们包含在一个自定义的多边形盒外壳中。

以下是主要的ADK硬件特性:
* 一个32位的ARM Cortex M3 微处理器。
* 将Android设备的USB连接和程序设计和调试的电脑连接分离。
* 灯光,颜色,距离,温度,湿度,气压,加速传感器
* 微SD卡插槽
* 支持蓝牙

此ADK预载了一个你可以立即使用的闹钟固件程序。ADK 2012是一个Android伴随程序,你可以在Google Play上下载它。Android应用程序和ADK固件(一个Arduino的草图)的源代码都可以在此页下载。

与ADK 2012一起发布的还有其他的部件,这些部件可以帮助你开发辅助设备,包括:
* AC能源适配器
* USB A 到 微型USB B的连接电缆
* 微型USB B到微型USB AB连接器(小的,矩形的插头)
* 微型 SD卡,在ADK的SDK卡槽中已经预装

使用闹钟

ADK中预载了一个闹钟程序。这个固件程序允许你像使用闹钟一样使用这个ADK。

一下是ADK使用步骤:

1.轻轻按压外壳两个最宽的面来打开ADK
2.将提供的AC电源适配器(圆形插头)连接到ADK主板上,或者将一根USB电缆连接到端口标记的电脑和你的电脑的USB端口上。
3.将你的指尖持续放在控制面板的闹钟符号上。

注意:你可能需要将你的手指持续放在适当的地方1-2秒。

4.使用时钟数字内部的+、-符号来设置正确的时间。
5.将你的指尖放在闹钟符号上来激活闹钟。
6.使用时钟数字内部的+、-符号来设置闹钟时间。
7.使用最近两个时钟数字内部的+、-符号来开启或关闭闹钟。
8.将你的指尖持续放在闹钟符号上,然后点击外壳上方的滑动控制来改变闹钟的音调。

使用ADK2012版伴随应用中的闹钟的步骤:

1.在你的Android设备中下载伴随应用,Android版本需要3.1(API等级12)或更高:
:* 用一个有NFC功能的Android设备,解锁,并按住ADK外壳左侧,按照提示安装应用。
:-或者-
:* 在你的设备上启动Google Play搜索ADK 2012应用并安装。如果你找不到应用程序,你的设备可能是不兼容的,请尝试在另一个设备上安装。
2.用下面其中的一种方法将你的Android设备连接到ADK上:
:* 用蓝牙连接:
:1.将AC电源适配器的插头插入ADK中
:2.将你的Android设备中的蓝牙功能开启(设置-蓝牙)
:3.在设置页面中,按蓝牙选项来查看匹配的设备
:4.选择搜索设备来找到ADK2012辅助设备,然后根据屏幕上的指示进行连接
:5.匹配完成后,在你的Android设备上开启ADK2012医用程序
:6.在启动画面中,选择使用蓝牙按钮
:7.在匹配设备的列表中,选择ADK 2012设备
:8.ADK 2012应用程序应该切换到菜单画面中,你可以开始与ADK辅助设备进行交互。
:* 用USB进行连接:
1.将AC电源适配器的插头插入ADK中
2.将微型USB AB的连接插头(小的矩形插头)连接到ADK板上端口标记的听筒上。
3.解锁你的Android设备,将微型USb B的连接插头连接到你的设备上。

注意:你的设备必须支持Android usb辅助设备模式。支持这种模式的设备包括Google Nexus设备。

4.在Android设备上,你应该看见连接到ADK DemoKit 2012的提示,选择 是 。
5.ADK 2012应用程序应该自动启动,然后你可以与ADK进行交互。

注意:当以USB连接Android设备来使用ADK的时候,要确保AC电源适配器已经插入。连接到电脑的USb连接插头不提供充足的电压来给ADK以及连接到设备的USb连接插头提供电力。

播放音频

ADK2012带有音频输出功能,包括一个放大器和扬声器。你可以通过蓝牙或者usb连接使用它让你的Android设备播放音频。
通过蓝牙播放音频:
1.根据上一节的指示,通过蓝牙将你的Android设备连接到ADK上
2.在你的Android设备上,操作到设置-蓝牙页面来查看匹配的设备列表,并确认与ADK连接
3.选择ADK2012边上的设置图标
4.确保媒体音频功能已启用
5.打开一个播放音乐或其他音频的应用程序
6.播放歌曲或声音,并通过ADK扬声器来聆听他!

通过USB来播放音频,你必须使用Android4.1(API等级16)或者更高版本的设备:

1.将AC电源适配器的插头插到ADK中
2.将微型USb AB的连接插头(小的矩形插头)连接到ADK板上端口标记的听筒上。
3.解锁你的Android设备,将微型USb B的连接插头连接到你的设备上。

注意:你的设备必须支持Android USb辅助设备模式。支持这种模式的设备包括Google Nexus设备。

4.在Android设备上,你应该看见一个连接到ADK Deomkit 2012的提示,选择取消使ADK仅作为媒体设备连接。
5.打开一个播放音乐或其他音频的应用程序
6.播放歌曲或声音,并通过ADK扬声器来聆听它!

注意:当以USb连接Android设备来使用ADK的时候,要确保AC电源适配器已经插入。连接到电脑的USb连接插头不提供充足的电压来给ADK以及连接到设备的USb连接插头提供电力。

使用ADK 2012开发辅助设备

ADK 2012是一个硬件平台,也是一套以原型设计Android辅助设备的软件库。这个部分讨论如何为ADK变成建立开发环境,来使它做你想做的事以及为建立你自己的Android辅助设备进行软件测试。

下载ADK源码

ADK2012支持的软件和硬件可以在Android源码库。按照以下的指示为ADK获取源材料。

下载ADK2012软件,源码,硬件设计说明书:

1.给你的开发系统下载并安装Git
2.按照Android open source project网站上的说明下载并安装回购工具
3.在终端窗口中,给所下载的资源文件建立一个新的指南,初始化并同步本地存储库:

$> mkdir android-accessories
$> cd android-accessories
$> repo init -u https://android.googlesource.com/accessories/manifest
$> repo sync

在成功完成这个步骤后,你应该拥有利用ADK2012工作的源码和工具。

  • adk2012/board- ADK2012的源代码和硬件设计文件
  • adk2012/app- Android伴随应用的源码
  • external/ide- ADK2012继承开发环境(IDE)的源码
  • external/toolchain- ADK2012IDE使用的文件系统和工具链

建立开发环境

ADK2012带有集成开发环境(IDE),你可以使用它来开发软件并未ADK2012辅助设备编写程序。下面的指示解释了如何建立并运行 ADK2012的IDE。

建立和运行ADK2012的IDE:

1从java.oracle.com上下载并安装JDK6或者更高的版本

2.为你的开发平台下载ADK2012的IDE
:* Windows

:* Mac
:* Linux32bit,64bit
3.解压下载的文件
4.解压ADK2012_IDE文件夹并执行arduino文件来运行应用程序

在你成功安装并运行ADK2012 IDE后,你必须配置它以使用ADK2012资源库。

使用ADK类库配置ADK2012 IDE:
1.启动ADK2012 IDE ,然后选择File>Preferences.
2.在Preferences对话框中,记下Sketchbook location这个目录
3.复制 /adk2012/board/library/ADK2这个目录和它的内容到你的sketchbook/libraries/目录,如此,你就可以创建一个sketchbook/libraries/ADK2目录。
4.停止然后重启ADK2012 IDE。
5.在IDE中,选择File>Examples>ADK2,然后选择其中一个例子
* clock-预载在ADK2012中的示例
* BluetoothScan-一个将辅助设备与Android设备通过蓝牙连接的示例演示代码
* usbaccessory-一个将辅助设备与Android设备通过USB电缆连接的示例演示代码
6.将ADK板上的电脑端口与你的用于开发的电脑用微型USB电缆相连接。
7.在ADK2012 IDE中,用ADK建立一个串行端口连接。选择Tools>Serial Port然后选择用于ADK的端口。
8.在ADK2012 IDE中,通过Tools>Board>GoogleADK2选择ADK
9.修改一个示例或新建一个
10.通过File>Upload上传示例到ADK。当ADK2012 IDE提示Done uploading,示例已经上传而且ADK已经准备好于你的Android设备通信。

使用ADK的替代生成系统

一个替代的,基于文件生成和上传的系统也可以在ADK2012中使用。这个系统基于命令行,也是为当使用IDE环境去装载软件到辅助设备不太方便时的生产环境设计的。

建立环境:
1.下载ADK2012源码文件
2.在一个终端窗口中,进入/adk2012/board/MakefileBasedBuild
3.运行一下命令,然后跟着指示:
$> ./setup

为你的辅助设备建立一个程序

1.将你的辅助设备的代码放到MakefileBasedBuild/app这个目录中,包括所有的类库文件。将app/main.c这个文件的格式作为你的标准格式
2.运行以下命令,然后跟着指示:
$> ./build

在你的辅助设备上载入程序:

1.运行构建程序,并确保你的程序编译成功
2.将辅助设备与你的电脑用USB连接
3.检查你的辅助设备连接到哪一个端口上,然后在flash脚本中修改UART这个变量以修正端口地址。在Linux机器上,端口地址一般是/dev/ttUSB0
4.运行以下命令以在辅助设备上载入程序
$> ./flash

ADK怎样与Android设备连接

Android辅助设备的核心特性是它的与Android设备连接及通信的能力。在你的辅助设备和Android设备被之间连接一个快速稳定的连接是构建一个应用于辅助设备被的软件的第一步。这个部分介绍ADK2012中使用连接和通信的要领,然后,你就可以应用它们去开发你自己的Android辅助设备。

用蓝牙进行ADK连接

ADK2012应用和硬件部分的辅助设备使用蓝牙串行端口配置文件(SPP)连接来通信。这种连接允许ADK辅助设备和Android设备之间的双向通信。
注意:ADK硬件的实现允许使用其他配置文件和多种连接方式。然而,ADK2012与Android应用之间的基本通信是基于SPP。
辅助设备的蓝牙代码

为了使用蓝牙进行通信,ADK2012辅助设备的clock.ino示例在执行setup()方法时调用一个btStart()方法以使使用无线电频率通信成为可能和开启蓝牙的监听模式。

ADK L;
void setup() {
L.adkInit();
L.btStart();
}
...
void btStart(){
uint8_t i, dlci;
int f;

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
L.btEnable(adkBtConnectionRequest, adkBtLinkKeyRequest, adkBtLinkKeyCreated,
adkBtPinRequest, NULL); dlci = L.btRfcommReserveDlci(RFCOMM_DLCI_NEED_EVEN); if(dlci) dbgPrintf("BTADK: failed to allocate DLCIn");
else{ //change descriptor to be valid...
for(i -1; i < sizeof(sdpDescrADK); i++){ if(sdpDescrADK[i] == MAGIX){
if(f i;
else break;
}
} if(i != -1){ dbgPrintf("BTADK: failed to find a single marker in descriptorn");
L.btRfcommReleaseDlci(dlci);
return;
} sdpDescrADK[f] = dlci >> 1; dbgPrintf("BTADK has DLCI %un", dlci); L.btRfcommRegisterPort(dlci, btAdkPortOpen, btAdkPortClose, btAdkPortRx);
L.btSdpServiceDescriptorAdd(sdpDescrADK, sizeof(sdpDescrADK));
}

}

请注意,sdpDescrADK这个对象包括了一个通用的唯一标识符(UUID)在变量BT_ADK_UUID中。这个标识符必须与在bluetoothSocket连接请求中提供的设备的UUID匹配。这个连接请求在Android应用的代码中可以找到。
一旦蓝牙可以与以上代码一起使用,辅助设备监听连接请求。ADK类库处理监听和连接详情,然后,辅助设备在每一个循环运行时调用

ADK::adkEventProcess()方法:
void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}

如果一个蓝牙连接已经被建立了,任何命令都被路由到btAdkPortRx()这个回调方法(这个回调方法在ADK类库中作为btStart()方法的一部分注册)然后根据情况执行。ADK辅助设备通过蓝牙连接用ADK::btRfcommPortTx()方法发回消息。如果你想了解更多细节,仔细看在clock.ino中这些方法的实现。

Android应用的蓝牙代码

在ADK2012Android应用中,处理蓝牙连接的代码封装在一个BTConnection类中。在这个类中,应用的请求访问蓝牙适配器然后与ADK2012辅助设备建立一个连接。一下是相关代码的摘要:

mAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = mAdapter.getRemoteDevice(address);
mSocket = device.createInsecureRfcommSocketToServiceRecord(ADK_UUID);
mSocket.connect();

注意第二行中的ADK_UUID参数。这个标识符必须辅助设备输出的标识符(就是之前提到的BT_ADK_UUID)相符。否则,协议将会失效,然后BluetoothSocket连接不会建立。一旦连接建立了,你从socket连接获得了一个InputStream和OutputStream对象以与辅助设备通信。

mInStream = mSocket.getInputStream();
mOutStream = mSocket.getOutputStream();

仔细阅读BTConnection.java文件,这个文件由下载的ADK2012软件提供,你可以从中获取更多的详情。

用USB进行ADK连接

ADK2012应用和辅助设备也可以那个USB连接来通信,这一点与最原始ADK类似。

辅助设备的USB代码

ADK类库拥有大部分USB连接的实现细节,辅助设备的代码必须调用一些方法以初始化USB连接,其中包括设置辅助设备的标示符字符串:

ADK L;
void setup() {
L.adkInit();
L.usbSetAccessoryStringVendor(...);
L.usbSetAccessoryStringName(...);
L.usbSetAccessoryStringLongname(...);
L.usbSetAccessoryStringVersion(...);
L.usbSetAccessoryStringUrl(...);
L.usbSetAccessoryStringSerial(...);

L.usbStart();
}

注意:标识符字符串必须与所连接的Android应用的USB辅助设备过滤设置相符,否则,应用将不会与辅助设备建立连接。

一旦USB与以上代码一起工作了,辅助设备开始监听连接请求。ADK类库处理监听到的事件和连接细节,然后辅助设备在每一次循环执行时调用ADK::adkEventProcess()方法:
void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}
辅助设备必须检查一个正在使用的USB连接以处理命令和发送消息。以下是相关代码的摘要:
void loop() {
if (L.accessoryConnected()) {
int recvLen = L.accessoryReceive(msg, sizeof(msg));
if (recvLen > 0) {
... // process message
}

1
L.accessorySend(outmsg, outmsgLen);

}
L.adkEventProcess();
}
想获得更多详情,请仔细阅读这些方法在clock.ino示例中的实现代码。

Android应用的USB代码

ADK2012的Android应用中,处理USB连接的代码被封装在一个UsbConnection类中,这个类建立一个BroadcastReceiver以监听USB事件然后在一个符合条件的连接事件被接收到是试图进行连接。以下是相关代码的摘要:
import com.android.future.usb.UsbAccessory;
import com.android.future.usb.UsbManager;

mUSBManager = UsbManager.getInstance(this);
UsbAccessory acc = mUSBManager.getAccessoryList()[0];

if (mUSBManager.hasPermission(acc)) return;
ADK2012应用使用支持库来实现USB辅助设备连接,这么做是为了支持Android2.3.4(API等级为10)的设备。如果你只需要支持Android3.1(API等级为12)和更高版本的设备,你可以替换以下代码中的前四行:
import android.hardware.usb.UsbAccessory
import android.hardware.usb.UsbManager

mUSBManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory acc = (UsbAccessory)

1
              intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);</java>

注意,此应用只在USB辅助设备标识符信息与res/xml/usb_accessory_filter.xml文件中的信息相符时才接受事件,这些在应用的清单文件中有记录:

ADK2012辅助设备不会接受来自其他USB设备的连接。

一旦连接被建立了,应用可以通过文件输入输出流与辅助设备通信,这一点在一下代码中可以见到:
ParcelFileDescriptor mFD = mUSBManager.openAccessory(acc);
if (mFD != null) {
FileDescripter fd = mFD.getFileDescriptor();
mIS = new FileInputStream(fd); // use this to receive messages
mOS = new FileOutputStream(fd); // use this to send commands
}
仔细阅读UsbConnection.java文件,这个文件在ADK2012源码中可以找到,你可以从中获得更多的实现细节。

USB音频接口的实现

ADK2012中一个重要的新特性是可以使用USB连接播放音频。这个创新举动作为Android开放辅助设备(AOA)协议2.0的一个更新被介绍,它可以在Android4.1(API等级16)或更高的设备上使用。
ADK2012为开发者提供了一个关于这个功能的参考实现。你不需要在Android设备上安装任何应用,辅助设备开发者需要支持AOAv2.这个实现演示了将16位,44.1kHz立体声PCM源数据的音频输出压缩到一个单通道中。而这一切都是基于辅助设备上的音频硬件。
使用由ADK类库提供的音频输出特性只要求调用一些方法。第一个调用的是辅助设备中的常规的setup()方法,这个方法使辅助设备准备好进行USB连接和音频输出,以下为示例代码的摘要:

ADK L;
void setup() {
L.audioInit();
L.usbh_init()
L.usbStart();
}

想要获取更多的关于ADK::audioInit()方法的信息,请查看libraries/ADK/Audio.c类库文件。想要获取更多关于ADK::usbh_init()方法的信息,请查看libraries/ADK/Usbh.c类库文件。
完成setup这个方法后,loop()方法调用ADK::adkEventProcess()方法以处理音频输出和其他ADK的方法:

void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}

这个调用运行ADK的任务队列,然后作为运行过程的一部分,任务队列运行libraries/ADK/Usbh_c中的usbh_work()方法,这个方法处理音频输出请求。仔细阅读这个方法的实现细节。想要获得更多的关于音频输出的实现细节,请查看libraries/ADK/accessroy.c这个类库文件。

2012版辅助开发工具包(ADT)新功能特性介绍及安装使用的更多相关文章

  1. android辅助开发工具包介绍

    辅助开发工具包(ADK)是为硬件制造商和业余爱好者准备的参考实现.硬件制造商和业余爱好者可以使用此工具包作为开发Android辅助设备的起点.每一个ADK发行版都将提供源代码和硬件规格,以使整个辅助设 ...

  2. openresty开发系列10--openresty的简单介绍及安装

    openresty开发系列10--openresty的简单介绍及安装 一.Nginx优点 十几年前,互联网没有这么火,软件外包开发,信息化建设,帮助企业做无纸化办公,收银系统,工厂erp,c/s架构偏 ...

  3. 什么是软件开发工具包(SDK)

    开发一个软件,需要经过编辑.编译.调试.运行几个过程. 编辑:使用编程语言编写程序代码的过程. 编译:如上一节所讲,就是将编写的程序进行翻译. 调试:程序不可能一次性编写成功,编写过程中难免会出现语法 ...

  4. 术语-软件-软件开发:SDK(软件开发工具包)

    ylbtech-术语-软件-软件开发:SDK(软件开发工具包) 软件开发工具包(缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架 ...

  5. 自己动手做AI:Google AIY开发工具包解析

    2018年国际消费性电子展(CES)上,最明显的一个趋势是Amazon与Google的语音技术进驻战,如AmazonAlexa进驻到Acer笔电内,Google Assist进驻到KIA汽车内,其他如 ...

  6. 微信公众平台开放JS-SDK(微信内网页开发工具包)

    微信公众平台开放JS-SDK(微信内网页开发工具包),这次开放接口是质的飞跃,是对开发者和广大用户一个利好的消息.未来的公众号图文消息会更丰富多彩,准备脑洞大开吧!(第三方平台正式支持接入微信公众平台 ...

  7. Visual Studio 2012下Box2D开发环境设置

    Cocos2d-x 3.x默认情况下采用的物理引擎是Chipmunk,如果我们要使用Box2D引擎,需要进行一些设置和调整,而且不同的开发平台下这些设置也有所不同.由于本书在此之前介绍的都是基于微软的 ...

  8. Android P新功能特性抢先看

    2018年3月8日,Google推出了Android P Preview版本,并提供官方镜像下载. 为了让广大开发者能够及时了解Android P的新功能特性,提前为您的app进行良好适配,WeTes ...

  9. python 全栈开发,Day90(Vue组件,前端开发工具包)

    昨日内容回顾 1. Vue使用 1. 生成Vue实例和DOM中元素绑定 2. app.$el --> 取出该vue实例绑定的DOM标签 3. app.$data --> 取出该vue实例绑 ...

随机推荐

  1. ReactNative调用aar文件(附:如何打开、查看aar文件内容)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7275897.html ReactNative可以用来进行一些嵌入式设备的操作终端开发,比如:ATM机.自动售卖 ...

  2. Java并发容器之阻塞队列BlockingQueue

    BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空. Bloc ...

  3. java的配置方式简介

    1,java的配置方式简介java的配置方式是为了代替使用xml配置方式,主要使用两个注解:@Configuration//通过该注解来表明该类是一个spring的配置,相当于一个xml文件@Comp ...

  4. Centos6下编译安装gcc6.4.0

    Centos6自带的gcc4.4.7不支持c++11, 于是编译安装最新版的gcc wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz .tar ...

  5. 【图像处理】openCV光流法追踪运动物体

    openCV光流法追踪运动物体 email:chentravelling@163.com 一.光流简单介绍 摘自:zouxy09 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观 ...

  6. 给你出道题---N个数字的静态决策区分问题

    决策,是世界上最重要的事情. 走路分两步:看准方向,大步前进.看准方向的过程就是决策. 任何一个问题,都对应两个空间:解空间和决策空间.我们所要做的就是使用决策空间去划分解空间. 决策可以分成两类:单 ...

  7. java struts2入门学习--防止表单重复提交.OGNL语言学习

    一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...

  8. 上海租房找房建议及条件,上海IT行业开发常见公司的位置地点

    上海租房,找房条件 以2号地铁线为中心,优先选择(回家方便,重点!),交通设施较集中地铁:2,3,4 区:普陀区,静安区,长宁区,闸北区,浦东新区,闵行区,徐汇区 路:镇坪路,威宁路,娄山关路,中山公 ...

  9. 在iOS开发的Quartz2D使用中实现图片剪切和截屏功能

    原文  http://www.jb51.net/article/75671.htm 图片剪切一.使用Quartz2D完成图片剪切1.把图片显示在自定义的view中先把图片绘制到view上.按照原始大小 ...

  10. 安卓Textview的getLineCount返回0

    ViewTreeObserver observer = tv.getViewTreeObserver(); // textAbstract为TextView控件 observer.addOnGloba ...