从 ContentResolver 的 openAssetFileDescriptor 方法获取 NegativeByteArraySizeException 以读取 vCardUri。有什么解决方法可以解决吗?
getting NegativeByteArraySizeException from ContentResolver's openAssetFileDescriptor method for reading vCardUri. Is there any workaround to fix it?
我正在创建一个 .VCF 文件来备份联系人。创建和插入数据的过程失败,因为 FileDescriptor's
方法 getDeclaredLength
其中 returns 大小 -1
我得到的 vCard-URI
的长度来自 ContentResolver's
openAssetFileDiscritor
方法。
这是与 完全相同的问题。但在这里提出同样问题的唯一问题是,所提出的解决方案对我来说有点难以理解。这并不能解决我的问题。 @pskink 在上述 link 解决方案中的评论可能有用,但我能够找到完整的源代码,因为评论中只提供了 1 行。
我正在使用下面的代码,
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd = resolver.openAssetFileDescriptor(uri, "r");
FileInputStream fis = fd.createInputStream();
byte[] b = new byte[(int)fd.getDeclaredLength()];
fis.read(b);
请多多指教。谢谢:)
所以我自己弄明白了,我发布了答案,以防有人遇到类似问题并坚持寻找解决方案。所以 byte[] b = new byte[(int)fd.getDeclaredLength()];
之前的代码是一样的。将此行更改为 byte[] buf = readBytes(fis);
,下面是方法 readBytes(FileInputStream fis)
。
public byte[] readBytes(InputStream inputStream) throws IOException {
// this dynamically extends to take the bytes you read
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
// this is storage overwritten on each iteration with bytes
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
// we need to know how may bytes were read to write them to the byteBuffer
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
byteBuffer.write(buffer, 0, len);
}
// and then we can return your byte array.
return byteBuffer.toByteArray();
}
希望对您有所帮助。干杯
我正在创建一个 .VCF 文件来备份联系人。创建和插入数据的过程失败,因为 FileDescriptor's
方法 getDeclaredLength
其中 returns 大小 -1
我得到的 vCard-URI
的长度来自 ContentResolver's
openAssetFileDiscritor
方法。
这是与
我正在使用下面的代码,
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd = resolver.openAssetFileDescriptor(uri, "r");
FileInputStream fis = fd.createInputStream();
byte[] b = new byte[(int)fd.getDeclaredLength()];
fis.read(b);
请多多指教。谢谢:)
所以我自己弄明白了,我发布了答案,以防有人遇到类似问题并坚持寻找解决方案。所以 byte[] b = new byte[(int)fd.getDeclaredLength()];
之前的代码是一样的。将此行更改为 byte[] buf = readBytes(fis);
,下面是方法 readBytes(FileInputStream fis)
。
public byte[] readBytes(InputStream inputStream) throws IOException {
// this dynamically extends to take the bytes you read
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
// this is storage overwritten on each iteration with bytes
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
// we need to know how may bytes were read to write them to the byteBuffer
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
byteBuffer.write(buffer, 0, len);
}
// and then we can return your byte array.
return byteBuffer.toByteArray();
}
希望对您有所帮助。干杯