如何从 .vcf 文件恢复 android 中的联系人?
Posted
技术标签:
【中文标题】如何从 .vcf 文件恢复 android 中的联系人?【英文标题】:How to restore contacts in android from a .vcf file? 【发布时间】:2013-10-03 14:52:06 【问题描述】:你好***
我正在尝试开发一个可以备份和恢复联系人的应用程序,backup
没有问题,但恢复是问题,这是我的代码
public class MainActivity extends Activity
Cursor cursor;
ArrayList<String> vCard ;
String vfile;
FileOutputStream mFileOutputStream = null;
Button btnRestorects = null;
Button btnBackupCts = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRestorects = (Button) findViewById(R.id.buttonRstCts);
btnBackupCts = (Button) findViewById(R.id.buttonBackCts);
vfile = "contacts.vcf";
final String storage_path = Environment.getExternalStorageDirectory().toString() +"/"+ vfile;
final File f = new File(storage_path);
btnBackupCts.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
try
if (!f.exists())
f.createNewFile();
mFileOutputStream = new FileOutputStream(storage_path, false);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
getVcardString();
);
btnRestorects.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
final Intent intent = new Intent();
final MimeTypeMap mime = MimeTypeMap.getSingleton();
String tmptype = mime.getMimeTypeFromExtension("vcf");
final File file = new File(Environment.getExternalStorageDirectory().toString() +"/contacts.vcf");
intent.setDataAndType(Uri.fromFile(file),tmptype);
startActivity(intent);
);
private void getVcardString()
// TODO Auto-generated method stub
vCard = new ArrayList<String>();
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if(cursor!=null&&cursor.getCount()>0)
cursor.moveToFirst();
for(int i =0;i<cursor.getCount();i++)
get(cursor);
Log.d("TAG", "Contact "+(i+1)+"VcF String is"+vCard.get(i));
cursor.moveToNext();
else
Log.d("TAG", "No Contacts in Your Phone");
try
mFileOutputStream.close();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
public void get(Cursor cursor)
//cursor.moveToFirst();
String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd;
try
fd = this.getContentResolver().openAssetFileDescriptor(uri, "r");
FileInputStream fis = fd.createInputStream();
byte[] buf = new byte[(int) fd.getDeclaredLength()];
fis.read(buf);
String vcardstring= new String(buf);
vCard.add(vcardstring);
mFileOutputStream.write(vcardstring.toString().getBytes());
catch (Exception e1)
// TODO Auto-generated catch block
e1.printStackTrace();
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
Permissions
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
我可以通过上述方式恢复,但问题是当调用代码 sn-p 时,我会收到一个警告对话框,提示选择要打开文件的应用程序,当我选择 Contact
应用程序时它会起作用,但我希望当我们点击按钮时自动恢复请帮助学习,并帮助我解决这个谜题。
提前致谢。
【问题讨论】:
如果你能提供你的整个代码,这将是一个很大的帮助,这样我就可以运行并了解你的问题 请参阅编辑后的帖子以获取完整的源代码@Meenal Sharma,谢谢。 【参考方案1】:使用此代码恢复联系人
final MimeTypeMap mime = MimeTypeMap.getSingleton();
String tmptype = mime.getMimeTypeFromExtension("vcf");
final File file = new File(Environment.getExternalStorageDirectory().toString()
+ "/contacts.vcf");
Intent i = new Intent();
i.setAction(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.fromFile(file), "text/x-vcard");
startActivity(i);
【讨论】:
感谢@Meenal Sharma,但问题仍然存在。 当我在我的设备上运行它时,它只是询问我想要存储联系人的对话框 还原时呢? 我说的只是恢复,把你的恢复按钮代码替换成我的,试一试以上是关于如何从 .vcf 文件恢复 android 中的联系人?的主要内容,如果未能解决你的问题,请参考以下文章
使用适用于 Android 的 ez-vcard 库导入 VCard 文件
Android 如何发送多个联系人附加在单个 .vcf 文件中并发送到邮件?