Открыть файл.vcf vCard напрямую с приложением контактов
Я пытаюсь программно запустить приложение контактов, чтобы импортировать большой файл.vcf с большим количеством контактов. Следующий код работает почти идеально.
String vcfMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("vcf");
Intent openVcfIntent = new Intent(Intent.ACTION_VIEW);
openVcfIntent.setDataAndType(Uri.fromFile(savedVCardFile), vcfMimeType);
startActivity(openVcfIntent);
Единственная проблема заключается в том, что в Android отображается диалоговое окно выбора приложений, в котором отображаются не только приложение контактов, но и Dropbox (или любое другое приложение, которое обрабатывает файлы vCard). Я хочу предотвратить такое поведение и напрямую открыть файл с помощью приложения контактов, чтобы импорт начался автоматически.
Я попробовал несколько вещей, найденных в Stackru без удачи, таких как установка:
openVcfIntent.setComponent(new ComponentName("com.android.contacts", "com.android.contacts.DialtactsContactsEntryActivity"));
openVcfIntent.setAction("android.intent.action.MAIN");
openVcfIntent.addCategory("android.intent.category.LAUNCHER");
openVcfIntent.addCategory("android.intent.category.DEFAULT");
Есть идеи как подойти к вопросу?
1 ответ
Отвечая на мой собственный вопрос. Я наконец нашел способ автоматически открывать vCard с приложением контактов, благодаря этому ответу о явных намерениях.
private void openBackup(File savedVCard)
{
try
{
String vcfMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("vcf");
Intent openVcfIntent = new Intent(Intent.ACTION_VIEW);
openVcfIntent.setDataAndType(Uri.fromFile(savedVCard), vcfMimeType);
// Try to explicitly specify activity in charge of opening the vCard so that the user doesn't have to choose
// https://stackru.com/questions/6827407/how-to-customize-share-intent-in-android/9229654#9229654
try
{
if (getActivity().getPackageManager() != null)
{
List<ResolveInfo> resolveInfos = getActivity().getPackageManager().queryIntentActivities(openVcfIntent, 0);
if (resolveInfos != null)
{
for (ResolveInfo resolveInfo : resolveInfos)
{
ActivityInfo activityInfo = resolveInfo.activityInfo;
if (activityInfo != null)
{
String packageName = activityInfo.packageName;
String name = activityInfo.name;
// Find the needed Activity based on Android source files: http://grepcode.com/search?query=ImportVCardActivity&start=0&entity=type&n=
if (packageName != null && packageName.equals("com.android.contacts") && name != null && name.contains("ImportVCardActivity"))
{
openVcfIntent.setPackage(packageName);
break;
}
}
}
}
}
}
catch (Exception ignored)
{
}
startActivity(openVcfIntent);
}
catch (Exception exception)
{
// No app for openning .vcf files installed (unlikely)
}
}