Windows phone 8 启动WP8中特定联系人的详细信息页面

Windows phone 8 启动WP8中特定联系人的详细信息页面,windows-phone-8,Windows Phone 8,在Twitter上,Justin Angel提到可以绕过已知的Windows Phone SDK限制,即无法启动ShowContactTask来显示给定联系人的详细信息()。我试图让它工作,但它只显示一个带有用户名的空白页 有没有可能有人举了一个例子来说明如何做到这一点 提前谢谢 正如我在twitter上所说,WP8不允许从定制的启动程序任务或通过app2app定制协议启动联系人详细信息 people hub支持在与contact details屏幕非常相似的屏幕中导入vCard。您可以使用此功

在Twitter上,Justin Angel提到可以绕过已知的Windows Phone SDK限制,即无法启动ShowContactTask来显示给定联系人的详细信息()。我试图让它工作,但它只显示一个带有用户名的空白页

有没有可能有人举了一个例子来说明如何做到这一点


提前谢谢

正如我在twitter上所说,WP8不允许从定制的启动程序任务或通过app2app定制协议启动联系人详细信息

people hub支持在与contact details屏幕非常相似的屏幕中导入vCard。您可以使用此功能主要导入vCard或显示联系人详细信息(即使它将显示为新联系人)。以下是用于人员中心的vCard app2app文件关联:


res://ContactsRes{屏幕分辨率}!VCard.FileTypeIcon.Small.png
res://ContactsRes{屏幕分辨率}!VCard.FileTypeIcon.Medium.png
res://ContactsRes{屏幕分辨率}!VCard.FileTypeIcon.Large.png
.vcf
.vcf
为了使用此app2app自定义协议,我们可以编写一些代码来创建vCard VCF文件,将其保存到IsoStore并在people hub中启动vCard

private void主页\u已加载(对象发送方、路由目标方)
{
var触点=新触点();
contacts.SearchCompleted+=contacts\u SearchCompleted;
contacts.SearchAsync(string.Empty,FilterKind.None,null);
}
专用异步无效联系人搜索已完成(对象发件人、联系人搜索目标e)
{
//获取联系人并为其制作vCard
接触=e.Results.First();
字符串vcard=GetContactVCard(触点);
调试写入线(vcard);
//将vCard作为VCF文件写入IsoStore
使用(var s=IsolatedStorageFile.GetUserStoreForApplication().CreateFile(“myContact.vcf”))
使用(var sw=新StreamWriter)
{
软件写入(vcard);
}
//启动VCF文件
var vcardStorageFile=wait ApplicationData.Current.LocalFolder.GetFileAsync(“myContact.vcf”);
LaunchFileAsync(vcardStorageFile);
}
接下来,我们必须实现构建vCard的功能。我们将使用vCard版本3.0,因为我们需要Base64嵌入图像(稍后将详细介绍)。我从Wikipedia复制了vCard 3.0格式,因此此示例没有任何特定于Microsoft的扩展。我只是将vCard复制到代码中,并从Contact类中输入了一些数据

私有字符串GetContactVCard(联系人)
{
返回string.Format(@“BEGIN:VCARD
版本:3.0
N:{0};{1}
FN:{2}
组织:{3}
标题:{4}
照片;类型=PNG;编码=B:{9}
电话;类型=工作,语音:{5}
电话;类型=家庭,语音:{6}
ADR;类型=工作:;{10}
ADR;TYPE=HOME:;;{11}
电子邮件;TYPE=PREF,INTERNET:{7}
REV:{8}
完:VCARD",
contact.CompleteName.LastName,
contact.CompleteName.FirstName,
contact.DisplayName,
contact.companys.Any()?contact.companys.First().CompanyName:string.Empty,
contact.CompleteName.Title,
contact.PhoneNumbers.Any(p=>p.Kind==PhoneNumberKind.Work)?contact.PhoneNumbers.First(p=>p.Kind==PhoneNumberKind.Work)。PhoneNumber:string.Empty,
contact.PhoneNumbers.Any(p=>p.Kind!=PhoneNumberKind.Work)?contact.PhoneNumbers.First(p=>p.Kind!=PhoneNumberKind.Work)。PhoneNumber:string.Empty,
contact.EmailAddresses.Any()?contact.EmailAddresses.First()。EmailAddress:string.Empty,
DateTime.Now.ToFileTimeUtc(),
GetPhotoBase64(联系人),
contact.Addresses.Any(a=>a.Kind==AddressKind.Home)?BuildAddress(contact.Addresses.First(a=>a.Kind==AddressKind.Home).PhysicalAddress):string.Empty,
contact.Addresses.Any(a=>a.Kind==AddressKind.Work)?BuildAddress(contact.Addresses.First(a=>a.Kind==AddressKind.Work.PhysicalAddress):string.Empty
);
}
你可以看到我没有花太多时间完善这个逻辑。最好是添加一些边缘条件处理,并移动到StringBuilder。接下来,我们将构建更复杂的地址字符串:

私有字符串构建地址(CivicAddress physicalAddress)
{
StringBuilder sb=新的StringBuilder();
字符串[]地址=新字符串[]
{
physicalAddress.AddressLine1,
physicalAddress.AddressLine2,
physicalAddress.City+“”+physicalAddress.StateProvince,
physicalAddress.CountryRegion,
physicalAddress.PostalCode
};
foreach(地址中的var行)
如果(!string.IsNullOrEmpty(行))
sb.追加(第+行“;”);
使某人返回字符串();
}
最后,我们需要将图像嵌入到vCard中。我们正在base64中嵌入联系人照片,因为WP8没有可用于该联系人照片的URL

私有字符串GetPhotoBase64(联系人)
{
使用(var picture=contact.GetPicture())
{
if(picture==null)
{
返回null;
}
其他的
{
使用(var sr=新的StreamReader(图片))
{
字节[]数据=新字节[图片长度];
图片读取(数据,0,数据长度);
返回Convert.tobase64字符串(数据);
}
}
}
}
运行此代码段时,我们可以看到它将联系人属性的大部分详细信息传递到导出/导入的vCard中:


正如我在twitter上所说,WP8不允许从定制的启动程序任务或通过app2app定制协议启动联系人详细信息

people hub支持在与con非常相似的屏幕中导入vCard