получение NegativeByteArraySizeException из метода openAssetFileDescriptor ContentResolver для чтения vCardUri. Есть ли обходной путь, чтобы это исправить? - PullRequest
0 голосов
/ 27 апреля 2019

Я создаю файл .VCF для резервного копирования контактов. Процесс создания и вставки данных завершился неудачно из-за метода FileDescriptor's getDeclaredLength, который возвращает размер -1 для длины vCard-URI, полученной из метода ContentResolver's openAssetFileDiscritor.

Это точно такой же вопрос, как и , заданный здесь Балакришной Авулапати . но единственная проблема для того, чтобы задать тот же вопрос здесь, заключается в том, что предложенное решение мне немного трудно понять. которые не решают мою проблему. Комментарий @ pskink в решении вышеуказанной ссылки может быть полезен, но я не могу найти полный исходный код, так как в комментарии есть только 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);

Пожалуйста, дайте доброе предложение. Спасибо:)

1 Ответ

0 голосов
/ 29 апреля 2019

Так что я сам разобрался, и выкладываю ответ на случай, если кто-нибудь получит подобную проблему и застрянет для решения.Таким образом, код перед 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();
}

Надеюсь, что это поможет.Приветствия

...