0

次のコードを使用して、連絡先を vCard 形式にエクスポートしようとしています。

(ここにあります: http://androidcodeexamples.blogspot.in/2012/06/export-contacts-as-vcf-file-in-android.html )

Cursor phones = mContext.getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                              null, null, null);
        phones.moveToFirst();
        for (int i = 0; i < phones.getCount(); i++) {
               String lookupKey = phones.getString(phones
                       .getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
               Uri uri = Uri.withAppendedPath(
               ContactsContract.Contacts.CONTENT_VCARD_URI,
                                             lookupKey);
               AssetFileDescriptor fd;
               try {
                       fd = mContext.getContentResolver().openAssetFileDescriptor(uri, "r");
                       FileInputStream fis = fd.createInputStream();
                       byte[] buf = new byte[(int) fd.getDeclaredLength()];
                       fis.read(buf);
                       String VCard = new String(buf);
                       String path = Environment.getExternalStorageDirectory()
                                .toString() + File.separator + vfile;
                       FileOutputStream mFileOutputStream = new FileOutputStream(path,
                                 true);
                       mFileOutputStream.write(VCard.toString().getBytes());
                       phones.moveToNext();
                       Log.d("Vcard", VCard);
               } catch (Exception e1) {
                       // TODO Auto-generated catch block
                       e1.printStackTrace();
               }
        }

しかし、 fis.read(buf) が原因で例外が発生すると思います。

例外は、「読み取りに失敗しました: EINVAL (無効な引数)」です。

誰か助けてくれませんか?

ありがとうございました!:)

4

4 に答える 4

1

同じ動作を見ました(Android 4.0.3および4.1.2でエミュレーターを試しました)。実際のデバイスでは問題なく動作しますが、エミュレータでは動作しません。

于 2012-11-21T21:46:18.907 に答える
0

同じ例外がありましたが、実際のデバイスでした。問題は、定義されていない電子メール タイプの電子メールを含む 1 つの連絡先でした。

于 2013-12-14T15:22:20.027 に答える
0

AssetFileDescriptor が長さで初期化されていない場合、 getDeclaredLengthは -1 を返します。この場合、 getStatSize()
を使用する方がよいでしょう。

于 2012-08-23T22:49:29.123 に答える