Android 如何从意向文件管理器打开.vcf?
你好,我正在尝试制作一个可以打开.vcf文件的应用程序。主要来自短信应用程序,我已经让它工作起来,我可以在androidmanifest.xml中使用以下代码打开我的应用程序Android 如何从意向文件管理器打开.vcf?,android,vcf-vcard,Android,Vcf Vcard,你好,我正在尝试制作一个可以打开.vcf文件的应用程序。主要来自短信应用程序,我已经让它工作起来,我可以在androidmanifest.xml中使用以下代码打开我的应用程序 <activity android:name=".Home" android:parentActivityName=".MapsActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY"
<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文件,但我不确定如何从该文件中获取数据。非常感谢您的帮助。要获取表示要查看或编辑的内容的
Uri
,请调用getIntent().getData()
。然后,您可以使用ContentResolver
和openInputStream()
获取要查看或编辑的实际内容的InputStream
,前提是Uri
就vCard本身而言,Android没有任何内置的vCard解析功能,就传统的JavaAPI而言。你的选择是:
- 使用
- 查找另一个第三方库或其他vCard解析大块代码(例如,联系人应用程序中的某个地方应该有一些)
- 滚动您自己的解析器以满足您的需要
Uri
,请调用getIntent().getData()
。然后,您可以使用ContentResolver
和openInputStream()
获取要查看或编辑的实际内容的InputStream
,前提是Uri
就vCard本身而言,Android没有任何内置的vCard解析功能,就传统的JavaAPI而言。你的选择是:
- 使用
- 查找另一个第三方库或其他vCard解析大块代码(例如,联系人应用程序中的某个地方应该有一些)
- 滚动您自己的解析器以满足您的需要
- 这其实不是一个非常复杂的过程。只要确保从FileProvider获得
Uri
,就可以触发电话簿选择器意图
然后,您就可以使用.vcf
导入您的联系人
private fun savevcf文件(savedVCard:File){
试一试{
val intent=intent(intent.ACTION_视图)
val uri=FileProvider.getUriForFile(
这
“${BuildConfig.APPLICATION\u ID}.fileprovider”,
存储卡
)
setDataAndType(uri,contentResolver.getType(uri))
intent.addFlags(intent.FLAG\授予\读取\ URI\权限)
星触觉(意图)
}捕获(异常:异常){
//TODO:处理异常
}
}
这其实不是一个非常复杂的过程。只要确保从FileProvider获得Uri
,就可以触发电话簿选择器意图
然后,您就可以使用.vcf
导入您的联系人
private fun savevcf文件(savedVCard:File){
试一试{
val intent=intent(intent.ACTION_视图)
val uri=FileProvider.getUriForFile(
这
“${BuildConfig.APPLICATION\u ID}.fileprovider”,
存储卡
)
setDataAndType(uri,contentResolver.getType(uri))
intent.addFlags(intent.FLAG\授予\读取\ URI\权限)
星触觉(意图)
}捕获(异常:异常){
//TODO:处理异常
}
}
@commonware我不是想将联系人导入我的电话簿,我是想从中获取数据(姓名、电子邮件、网站等),如果您阅读了该问题的答案,你会注意到,我给你指了一个项目来做这件事。@commonware我会在几天前给你,但我只需要从联系人那里获取网站,所以我想让它尽可能小。我想我可能需要使用getIntent();如果我做不到的话。你对此有经验吗?@commonware我不是想把联系人导入我的电话簿,我是想从中获取数据(姓名、电子邮件、网站等),如果你读了这个问题的答案,你会注意到,我给你指了一个项目来做这件事。@commonware我会在几天前给你,但我只需要从联系人那里获取网站,所以我想让它尽可能小。我想我可能需要使用getIntent();如果我做不到的话。你有这方面的经验吗?
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];
}