gpt4 book ai didi

android - 在 Android 7 中,ContentResolver 的方法 openAssetFileDescriptor(vCardUri, "r") 返回具有 declaredLength 为 -1 的 AssetFileDescriptor

转载 作者:太空狗 更新时间:2023-10-29 16:12:27 34 4
gpt4 key购买 nike

在 Android 7 中,getContentResolver().openAssetFileDescriptor(vCardUri, "r")返回 AssetFileDescriptor getDeclaredLength() 返回的 declaredLength 为 -1 .

尝试将联系人作为 vcards 导出到 vcf 文件中。我试过的代码如下

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);

上面的代码在 Android 6 或更低版本中完美运行。但是当使用 Android 7 运行时,创建 byte[] 的行导致 NegativeByteArraySizeException因为 declaredLength 是 -1。当我调试下载 Android 7 的源代码时,我发现了这个问题。任何一种健康都会非常可观。

最佳答案

在@pskink 的帮助下,我发现以下方法解决了我的问题。

String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri vCardUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor assetFileDescriptor;
FileInputStream inputStream;
try {
assetFileDescriptor = getActivity().getContentResolver().openAssetFileDescriptor(vCardUri, "r");
if (assetFileDescriptor != null) {
inputStream = assetFileDescriptor.createInputStream();
return readAsByteArray(inputStream);
}
} catch (FileNotFoundException e) {
Log.e(TAG, "Vcard for the contact " + lookupKey + " not found", e);
} catch (IOException e) {
Log.e(TAG, "Problem creating stream from the assetFileDescriptor.", e);
}

其中 readAsByteArray() 是使用来自 Mihai Snippet 的代码编写的.

谢谢@pskink

关于android - 在 Android 7 中,ContentResolver 的方法 openAssetFileDescriptor(vCardUri, "r") 返回具有 declaredLength 为 -1 的 AssetFileDescriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017591/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com