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

标签 android android-contacts android-contentresolver vcf-vcard android-7.0-nougat

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

相关文章:

android - 使用 Retrofit 库获取简单的 JSON 对象响应

android - 联系人备份和同步应用程序

android - 是否可以从结束预付费电话后出现的对话中读取通话费用历史记录?

android - 如何通过 ContentResolver 调用 ContentProvider 中的自定义方法,然后访问 Bundle?

java - 为什么我的横幅出现在我的主视图下?

Android Studio/Gradle : force some modules to be built and copied to a directory before building the main app

android - 5 秒后关闭 Android 游戏

android - 从安卓联系人中删除联系人

Android 4.4 (KitKat) 上的 Android Gallery 为 Intent.ACTION_GET_CONTENT 返回不同的 URI

Android:倾斜移动使 ImageView 内容消失/URI 刷新