java filedescriptor_Java AssetFileDescriptor.getFileDescriptor方法代码示例

该代码段展示了在Android中如何根据不同的URI类型设置数据源。它涉及到SmbProxy的使用,处理file协议,以及通过ContentResolver打开AssetFileDescriptor进行数据源设置。主要涵盖了Android内容解析和文件操作的核心流程。
摘要由CSDN通过智能技术生成

import android.content.res.AssetFileDescriptor; //导入方法依赖的package包/类

public void setDataSource(Context context, Uri uri)

throws IllegalArgumentException, SecurityException {

if (uri == null) {

throw new IllegalArgumentException();

}

String scheme = uri.getScheme();

if (SmbProxy.needToStream(scheme)){

mSmbProxy = SmbProxy.setDataSource(uri, this, null);

return;

}

if(scheme == null || scheme.equals("file")) {

setDataSource(uri.getPath());

return;

}

AssetFileDescriptor fd = null;

try {

ContentResolver resolver = context.getContentResolver();

try {

fd = resolver.openAssetFileDescriptor(uri, "r");

} catch(FileNotFoundException e) {

throw new IllegalArgumentException();

}

if (fd == null) {

throw new IllegalArgumentException();

}

FileDescriptor descriptor = fd.getFileDescriptor();

if (!descriptor.valid()) {

throw new IllegalArgumentException();

}

// Note: using getDeclaredLength so that our behavior is the same

// as previous versions when the content provider is returning

// a full file.

if (fd.getDeclaredLength() < 0) {

setDataSource(descriptor);

} else {

setDataSource(descriptor, fd.getStartOffset(), fd.getDeclaredLength());

}

return;

} catch (SecurityException ex) {

} finally {

try {

if (fd != null) {

fd.close();

}

} catch(IOException ioEx) {

}

}

setDataSource(uri.toString(), null, null);

}

在Unity中获取USB设备的FileDescriptor可以通过AndroidJavaObject类来实现。具体步骤如下: 1. 首先,需要在Unity项目中创建一个C#脚本,在脚本中使用AndroidJavaObject类来获取USB的FileDescriptor。 2. 在脚本中定义一个AndroidJavaClass对象和一个AndroidJavaObject对象,用于获取USB设备的信息。 3. 在脚本中定义一个方法,用于获取USB设备的FileDescriptor。 4. 在方法中,使用AndroidJavaObject对象调用getSystemService方法获取USB_SERVICE,再使用AndroidJavaObject对象调用openDevice方法打开USB设备,并获取其FileDescriptor。 下面是示例代码: ```csharp using UnityEngine; public class USBManager : MonoBehaviour { private AndroidJavaClass usbManagerClass; private AndroidJavaObject usbManagerObject; private AndroidJavaObject usbDeviceObject; public int GetFileDescriptor() { // 获取USB_SERVICE usbManagerClass = new AndroidJavaClass("android.content.Context"); string usbServiceName = usbManagerClass.GetStatic<string>("USB_SERVICE"); usbManagerObject = this.Call<AndroidJavaObject>("getSystemService", usbServiceName); // 获取USB设备 AndroidJavaClass usbDeviceClass = new AndroidJavaClass("android.hardware.usb.UsbDevice"); int vendorId = 1234; // USB设备的vendor id int productId = 5678; // USB设备的product id AndroidJavaObject usbDeviceListObject = usbManagerObject.Call<AndroidJavaObject>("getDeviceList"); AndroidJavaObject[] usbDeviceArray = AndroidJNIHelper.ConvertFromJNIArray<AndroidJavaObject[]>(usbDeviceListObject.GetRawObject()); foreach (AndroidJavaObject device in usbDeviceArray) { int devVendorId = device.Call<int>("getVendorId"); int devProductId = device.Call<int>("getProductId"); if (devVendorId == vendorId && devProductId == productId) { usbDeviceObject = device; break; } } // 打开USB设备并获取FileDescriptor AndroidJavaObject usbDeviceConnectionObject = usbManagerObject.Call<AndroidJavaObject>("openDevice", usbDeviceObject); return usbDeviceConnectionObject.Call<int>("getFileDescriptor"); } } ``` 注意:上述代码只适用于Android平台,如果需要在iOS或其他平台上实现类似功能,需要使用相应的API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值