qq_17031883 2025-09-14 16:35 采纳率: 36.4%
浏览 7
已结题

c# Xamarin怎么获取手机通讯录和短信

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 机制,建议使用 MediaStore API 替代直接访问文件系统。


    五、完整流程总结

    1. 申请权限:在 AndroidManifest.xml 和运行时动态请求权限。
    2. 读取数据
      • 通讯录:使用 ContactsContract
      • 短信:使用 ContentResolver 查询 content://sms/inbox
      • 图片:使用 MediaStore.Images.Media
    3. 保存数据:将读取的信息写入外部存储的文本文件中。
    4. 读取文件:程序可随时从指定路径读取文本文件。

    六、注意事项

    • 隐私问题:获取用户通讯录、短信等敏感信息需谨慎,确保符合法律法规。
    • 权限管理:在 Android 6.0+ 上必须动态请求权限。
    • 存储访问:Android 10+ 推荐使用 Scoped Storage,避免直接访问 /sdcard/

    如果你需要我提供一个完整的 Xamarin Android 项目模板或代码示例,请告诉我,我可以为你生成对应的代码结构。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 12月2日
  • 已采纳回答 11月24日
  • 创建了问题 9月14日