在 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/