c# Xamarin怎么获取手机通讯录和短信和照片,想获取andriod 手机通讯录和短信,并保存到内存卡指定目录,方便程序读取信息
5条回答 默认 最新
檀越@新空间 2025-09-14 16:36关注下午好🌅🌅🌅
本答案参考通义千问在使用 C# Xamarin 开发 Android 应用时,想要获取手机的通讯录、短信和照片,需要遵循 Android 的权限机制,并且在不同系统版本中可能有不同的实现方式。下面将详细说明如何通过 Xamarin 实现这些功能。
一、获取 Android 手机通讯录
1. 需要的权限
在
AndroidManifest.xml中添加以下权限:<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" />注意: 在 Android 6.0(API 23)及以上版本中,还需要动态请求权限。
2. 动态请求权限代码(C#)
public void RequestReadContactsPermission() { if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadContacts) != Permission.Granted) { ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadContacts }, 1); } else { LoadContacts(); } }3. 获取通讯录信息并保存到内存卡
private void LoadContacts() { var contacts = new List<Contact>(); using (var cursor = ContentResolver.Query(ContactsContract.Contacts.ContentUri, null, null, null, null)) { while (cursor.MoveToNext()) { var contactId = cursor.GetString(cursor.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.Id)); var displayName = cursor.GetString(cursor.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.DisplayName)); // 获取电话号码 var phoneCursor = ContentResolver.Query( ContactsContract.CommonDataKinds.Phone.ContentUri, null, ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + " = ?", new string[] { contactId }, null); var phoneNumbers = new List<string>(); while (phoneCursor.MoveToNext()) { var number = phoneCursor.GetString(phoneCursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number)); phoneNumbers.Add(number); } contacts.Add(new Contact { Name = displayName, PhoneNumbers = phoneNumbers }); phoneCursor.Close(); } } SaveContactsToFile(contacts); } private void SaveContactsToFile(List<Contact> contacts) { var path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/Contacts.txt"; File.WriteAllText(path, string.Join("\n", contacts.Select(c => $"{c.Name}: {string.Join(", ", c.PhoneNumbers)}"))); }重点: 使用
ContentResolver查询联系人信息,然后保存为文本文件到外部存储。
二、获取 Android 手机短信
1. 需要的权限
<uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" />注意: Android 10 及以上版本对 SMS 访问限制更严格,建议使用
SmsManager或第三方库。2. 动态请求权限
public void RequestReadSmsPermission() { if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadSms) != Permission.Granted) { ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadSms }, 2); } else { LoadSms(); } }3. 获取短信内容并保存
private void LoadSms() { var smsList = new List<SmsMessage>(); var uri = Uri.Parse("content://sms/inbox"); using (var cursor = ContentResolver.Query(uri, null, null, null, null)) { while (cursor.MoveToNext()) { var address = cursor.GetString(cursor.GetColumnIndex("address")); var body = cursor.GetString(cursor.GetColumnIndex("body")); var date = cursor.GetString(cursor.GetColumnIndex("date")); smsList.Add(new SmsMessage { Address = address, Body = body, Date = date }); } } SaveSmsToFile(smsList); } private void SaveSmsToFile(List<SmsMessage> messages) { var path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/SMS.txt"; File.WriteAllText(path, string.Join("\n", messages.Select(m => $"{m.Date} - {m.Address}: {m.Body}"))); }重点: 使用
ContentResolver查询短信内容,保存为文本文件。
三、获取 Android 手机照片
1. 需要的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />注意: Android 6.0 及以上版本需动态请求权限。
2. 动态请求权限
public void RequestReadExternalStorage() { if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != Permission.Granted) { ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 3); } else { LoadImages(); } }3. 获取图片路径并保存到指定目录
private void LoadImages() { var images = new List<string>(); var mediaStore = MediaStore.Images.Media.GetContentUri("external"); using (var cursor = ContentResolver.Query(mediaStore, null, null, null, null)) { while (cursor.MoveToNext()) { var imagePath = cursor.GetString(cursor.GetColumnIndex(MediaStore.Images.Media.InterfaceConsts.Data)); images.Add(imagePath); } } SaveImagesToFile(images); } private void SaveImagesToFile(List<string> imagePaths) { var path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/Images.txt"; File.WriteAllLines(path, imagePaths); }重点: 使用
MediaStore查询图片路径,保存为文本文件。
四、保存到内存卡(外部存储)
在 Xamarin 中,可以使用以下方式获取外部存储路径:
var externalStorage = Android.OS.Environment.ExternalStorageDirectory; var path = Path.Combine(externalStorage.AbsolutePath, "YourFolderName");注意: 在 Android 10 及以上版本中,应使用
Scoped Storage机制,建议使用MediaStoreAPI 替代直接访问文件系统。
五、完整流程总结
- 申请权限:在
AndroidManifest.xml和运行时动态请求权限。 - 读取数据:
- 通讯录:使用
ContactsContract。 - 短信:使用
ContentResolver查询content://sms/inbox。 - 图片:使用
MediaStore.Images.Media。
- 通讯录:使用
- 保存数据:将读取的信息写入外部存储的文本文件中。
- 读取文件:程序可随时从指定路径读取文本文件。
六、注意事项
- 隐私问题:获取用户通讯录、短信等敏感信息需谨慎,确保符合法律法规。
- 权限管理:在 Android 6.0+ 上必须动态请求权限。
- 存储访问:Android 10+ 推荐使用
Scoped Storage,避免直接访问/sdcard/。
如果你需要我提供一个完整的 Xamarin Android 项目模板或代码示例,请告诉我,我可以为你生成对应的代码结构。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 申请权限:在