平板电脑是否可以实现OTG以实现自己的目的,但阻止应用程序使用它?



我是android编程新手,我的项目需要serial communicationarduino board。我从导入ArduinoUSBsource code开始构建我的第一个项目。

在此代码中,我在OTG mode中使用了android device,并且arduino board作为slave连接。它实现了pseudo serial device。 我相当容易成功地在wiko smartphone (android 5.1)communicate,但我无法让它在ezeepad 785 tablet running android 4.1.1上运行。

我最初认为tablet不支持OTG,但实际上并非如此,因为如果我通过OTG cable连接了tablet上的memory stick,我可以看到记忆棒中的文件。

然而,在我的wiko phone,当我第一次connectarduino board时,我得到了dialog"关于此usb device连接的开放ArduinoUSB?",这在我的tablet上从未发生过。

为了进行调查,我在代码中添加了printout语句,以显示arduino board连接时激活了哪些方法。

在这里,我再次在screen上看到wiko phone的消息,表明broadcast message正在receivedarduino boardVID,等等。 当我在tablet上运行相同的code时,没有任何反应。没有证据表明arduino boardbroadcast message

我已经从play storeinstalledUSB OTG检查器应用程序,同样,这个应用程序显示我的arduino boardwiko phone上连接,而在tablet上没有任何连接。

tablet是否有可能实现仅支持memory stickpartial OTG功能,甚至将其隐藏到另一个应用程序中? 因为在我的wiko phone上,如果我连接一个memory stick,由于我在code中添加了额外的打印,我可以读取screen上棍子的VID。这不会发生在tablet上。

我正处于wit's尽头...

这是代码。请不要介意它的"快速和肮脏"!:

private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { //Broadcast Receiver to automatically start and stop the Serial connection.
@Override
public void onReceive(Context context, Intent intent) {
tvAppend(textView,"BROADCAST RECEIVERrn");
if (intent.getAction().equals(ACTION_USB_PERMISSION)) {
boolean granted = intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED);
if (granted) {
connection = usbManager.openDevice(device);
serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection);
if (serialPort != null) {
if (serialPort.open()) { //Set Serial Connection Parameters.
setUiEnabled(true);
serialPort.setBaudRate(9600);
serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8);
serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1);
serialPort.setParity(UsbSerialInterface.PARITY_NONE);
serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
serialPort.read(mCallback);
tvAppend(textView,"Serial Connection Opened!n");
} else {
tvAppend(textView,"SERIAL PORT NOT OPEN");
}
} else {
tvAppend(textView,"SERIAL PORT IS NULL");
}
} else {
tvAppend(textView,"SERIAL PERM NOT GRANTED");
}
} else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
onClickStart(startButton);
} else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
onClickStop(stopButton);
} else tvAppend(textView,"UNKNOWN ACTION");
}
;
};

如您所见,在任何广播消息上,文本视图组件中都会打印一个句子。 如果消息是 USB 权限,则此代码依次调用以下代码:

public void onClickStart(View view) {
HashMap<String, UsbDevice> usbDevices = usbManager.getDeviceList();
if (!usbDevices.isEmpty()) {
boolean keep = true;
for (Map.Entry<String, UsbDevice> entry : usbDevices.entrySet()) {
device = entry.getValue();
int deviceVID = device.getVendorId();
if (deviceVID == 0x1EAF)//Maple R3   Vendor ID
{
int devicePID = device.getProductId() ; // Le PID du BSL est 3
if ( devicePID == 4 ) {                 // Le PID du port série émulé est 4
tvAppend(textView, "ndevice PID : " + devicePID + "n");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
usbManager.requestPermission(device, pi);
keep = false;
}
} else {
tvAppend(textView, "ndevice VID : " + deviceVID + "n");
connection = null;
device = null;
}
if (!keep)
break;
}
}
else
tvAppend(textView, "nPas de réponse" + "n");

}

其中检查 VID 和 PID 并相应地打印消息。请注意,为了简单起见,我说arduino,但该板实际上是Olimexino STM32,相当于Maple R3,因此VID不同。 总而言之,主要问题是,当我在OTG上连接设备时,在我的平板电脑中,广播接收器永远不会被调用,而这在我的wiko手机上有效。同样,平板电脑看到连接的记忆棒,因为资源管理器可以显示其文件。 是否可以在平板电脑固件中完全拦截USB流量,以防止用户将OTG功能用于其他目的?

在编译时,Android Studio 为平板电脑选择 API 16,为手机选择 API 22。API 之间存在差异,可以解释这种行为吗?

只是为了更清楚:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.user.someApp">
<uses-feature
android:name="android.hardware.usb.host"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service
android:name=".UsbService"
android:enabled="true" />

</application>
</manifest>

工程师,感谢您花时间检查我的问题。

我的清单是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hariharan.arduinousb" >
<uses-feature android:name="android.hardware.usb.host" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.hariharan.arduinousb.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
</application>
</manifest>

如您所见: 在 uses-feature 中,缺少 .required 参数。我添加了它。/service 块也丢失了。我尝试添加它,但出现"未解析的类引用"错误。在我下载的项目.zip(见上面的链接)中,没有此声明。

但是,在此更正之后,行为是相同的:在 API 22 上检测到 USB 设备,而不是在 API 16 上检测到。

相关内容

  • 没有找到相关文章

最新更新