Android在到處.vcf聯絡人時,vCard獲取不到版本號

mahongy發表於2020-11-10

    在嘗試匯出.vcf聯絡人時,發現目前Android沒有提供獲取當前手機支援的vcard版本號。

    目前的Android版本(10及之前)中看到的預設方式的版本都是2.1。

    對比原生Contacts(com.android.contacts)中的處理方案:

    ExportVCardActivity.java

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        ...
        final Uri targetFileName = data.getData();
        final ExportRequest request = new ExportRequest(targetFileName);
        mService.handleExportRequest(request, new NotificationImportExportListener(
                        ExportVCardActivity.this));
        ...
    }

    該方法中負責建立ExportRequest物件。其中,mService是VCardService.java。

    ExportRequest.java

    public ExportRequest(Uri destUri) {
        this(destUri, null);
    }

    public ExportRequest(Uri destUri, String exportType) {
        this.destUri = destUri;
        this.exportType = exportType;
    }

    由此可見,ExportVCardActivity中在建立ExportRequest物件時,只傳入了Uri,並沒有傳入exportType,因此exportType將是null,而vCard的版本號正式由exportType轉換後得到的。不同的手機廠商在適配自己的Contacts時可能會修改上面的這行程式碼:

final ExportRequest request = new ExportRequest(targetFileName);

                          ||
                          ||

final ExportRequest request = new ExportRequest(targetFileName, exportType);

    使其傳入exportType。

    VCardService.java

    public synchronized void handleExportRequest(ExportRequest request,
            VCardImportExportListener listener) {
        if (tryExecute(new ExportProcessor(this, request, mCurrentJobId, mCallingActivity))) {
            ...
        } else {
            ...
        }
    }

    handleExportRequest()中建立ExportProcessor物件。

    ExportProcessor.java

    private void runInternal() {
        ...
        VCardComposer composer = null;
        final String exportType = request.exportType;
        final int vcardType;
        if (TextUtils.isEmpty(exportType)) {
            vcardType = VCardConfig.getVCardTypeFromString(
                    mService.getString(R.string.config_export_vcard_type));
        } else {
            vcardType = VCardConfig.getVCardTypeFromString(exportType);
        }
        composer = new VCardComposer(mService, vcardType, true);
        ...
    }

    上面看到在建立ExportRequest物件時沒有傳入exportType,因此,該方法中將根據R.string.config_export_vcard_type資源獲取vcardType,這個config_export_vcard_type是屬於Contacts應用,所以,不同的手機廠商很可能根據Android的版本或者自己的產品要求,適配vCard的版本。

    因此,目前獲取不到手機系統支援的vCard版本號,,在匯出.vcf聯絡人時,只能採用預設方式。

    若哪位碼友有獲取vCard版本號的方式(不包括從.vcf檔案中獲取),勞煩賜教。

參考:https://blog.csdn.net/michael_yt/article/details/78270537

------記錄工作中的點點滴滴,書寫碼農的平凡歲月!------

   

相關文章