Как открыть.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
}
}