Android 如何从意向文件管理器打开.vcf?

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"

你好,我正在尝试制作一个可以打开.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文件,但我不确定如何从该文件中获取数据。非常感谢您的帮助。

要获取表示要查看或编辑的内容的
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];
      }