Как открыть.vcf из намеренного файлера?

Здравствуйте, я пытаюсь сделать приложение, где я могу открыть файлы.vcf. В основном из текстовых приложений, и я заставил его работать, где я могу открыть свое приложение, используя следующий код в androidmanifest.xml

 <activity android:name=".Home"
       android:parentActivityName=".MapsActivity">

       <meta-data android:name="android.support.PARENT_ACTIVITY"
        android:value="MapsActivity" />
           <intent-filter android:label="Open iLocation">
              <action android:name="android.intent.action.VIEW" />
               <action android:name="android.intent.action.EDIT" />
               <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                  <data android:scheme="content" />
                  <data android:mimeType="text/x-vcard" />
           </intent-filter>
       <intent-filter android:label="Open iLocation">
           <action android:name="android.intent.action.VIEW" />
           <action android:name="android.intent.action.EDIT" />
           <category android:name="android.intent.category.DEFAULT" />
           <data android:scheme="file" />
           <data android:mimeType="text/x-vcard" />
           <data android:pathPattern=".*\.vcf" />
           <data android:pathPattern=".*\..*\.vcf" />
           <data android:pathPattern=".*\..*\..*\.vcf" />
           <data android:pathPattern=".*\..*\..*\..*\.vcf" />
           <data android:pathPattern=".*\..*\..*\..*\..*\.vcf" />
           <data android:host="*" />
       </intent-filter>
   </activity>

Это открывает мой файл.Home, но я не уверен, как получить данные из файла. Любая помощь будет принята с благодарностью.

1 ответ

Решение

Чтобы получить Uri представляющий контент, который вы хотите просмотреть или отредактировать, позвоните getIntent().getData(), Затем вы можете использовать ContentResolver а также openInputStream() чтобы получить InputStream на фактический контент, который вы предлагаете для просмотра или редактирования, учитывая, что Uri,

С точки зрения самой vCard, в Android нет ничего встроенного для анализа vCard, с точки зрения традиционного Java API. Ваш выбор:

  • Используйте эту стороннюю библиотеку

  • Найдите другую стороннюю библиотеку или другой фрагмент кода для анализа vCard (например, в приложении "Контакты" должно быть где-то там)

  • Сверните свой собственный парсер, достаточный для ваших нужд

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { 
     mIntent.setAction(Intent.ACTION_GET_CONTENT);
     mIntent.setType("text/x-vcard");
     startActivityForResult(mIntent, 1);
} else {
     mIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);
     mIntent.addCategory(Intent.CATEGORY_OPENABLE);
     mIntent.setDataAndType(Uri.fromFile(contactFolder), "text/x-vcard");
     startActivityForResult(Intent.createChooser(mIntent, "Select File"), 2);
}

И получить намеренный результат.....

@SuppressLint("NewApi")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Uri mUri = data.getData();
        if (mUri != null) {
            String mFilePath;
            if (requestCode == 1) {
                mFilePath = mUri.getPath();
            } else {
                mFilePath = getPathFromURI(mUri);
            }
            Intent mIntent = new Intent(this, RestoreActivity.class);
            mIntent.putExtra("filepath", mFilePath);
            startActivity(mIntent);
        } else {
            Toast.makeText(this, "Something went wrong...\nPlease try again...", Toast.LENGTH_SHORT).show();
        }
    }
}

@SuppressLint("NewApi")
private String getPathFromURI(Uri mUri) {
    String mDocId = DocumentsContract.getDocumentId(mUri);
    String[] mSplit = mDocId.split(":");
    return Environment.getExternalStorageDirectory() + File.separator + mSplit[1];
}

На самом деле это не очень сложный процесс. Просто убедитесь, что вы получили Uri из FileProvider, и вы сможете запустить намерение выбора телефонной книги.

Затем вы сможете импортировать свои контакты с помощью .vcf.

private fun saveVcfFile(savedVCard: File) {
    try {
        val intent = Intent(Intent.ACTION_VIEW)
        val uri = FileProvider.getUriForFile(
            this,
            "${BuildConfig.APPLICATION_ID}.fileprovider",
            savedVCard
        )
        intent.setDataAndType(uri, contentResolver.getType(uri))
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        startActivity(intent)
    } catch (exception: Exception) {
        // TODO: Handle Exception
    }
}
Другие вопросы по тегам