You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# Xamarin Forms Android中获取IMEI号码?

获取Xamarin Forms Android设备IMEI的解决方案

一、解决基础上下文问题

之前代码里的Forms.Context已被弃用,直接改用Android.App.Application.Context替代,可解决上下文找不到的问题。

二、定义共享项目的统一接口

先在Xamarin Forms共享项目中创建接口,保证跨平台调用的一致性:

namespace AppMobile.Models
{
    public interface IDevice
    {
        string GetImei();
    }
}

三、Android项目的实现(含权限处理)

1. 配置权限

在Android项目的AndroidManifest.xml中添加对应权限:

<!-- Android 9及以下版本需要 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Android 10+ 仅特殊应用(如系统预装、电话类应用)可申请该权限 -->
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />

注意:Android 10(API 29)及以后,普通应用无法获取IMEI,只有系统应用、预装应用或拥有READ_PRIVILEGED_PHONE_STATE权限的应用才能获取,否则会返回null。若你的应用不属于这类特殊应用,建议改用Android ID或OAID作为设备唯一标识。

2. 接口实现代码

using Android.App;
using Android.Content;
using Android.Telephony;
using Android.OS;
using AppMobile.Models;
using Xamarin.Forms;

[assembly: Dependency(typeof(UniqueIdAndroid))]
namespace AppMobile.Models
{
    public class UniqueIdAndroid : IDevice
    {
        public string GetImei()
        {
            string imei = null;
            var telephonyManager = Application.Context.GetSystemService(Context.TelephonyService) as TelephonyManager;

            // Android 6+ 需要动态申请权限
            if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
            {
                if (ContextCompat.CheckSelfPermission(Application.Context, Android.Manifest.Permission.ReadPhoneState) != Android.Content.PM.Permission.Granted)
                {
                    return "权限未授权";
                }
            }

            // 适配不同Android版本的IMEI获取方法
            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                imei = telephonyManager.Imei;
            }
            else
            {
                imei = telephonyManager.DeviceId;
            }

            return imei ?? "无法获取IMEI";
        }
    }
}

四、补充:动态申请权限的页面代码

在Xamarin Forms页面中主动触发权限申请(不能直接在依赖服务中申请):

using Xamarin.Essentials;

// 示例:在按钮点击事件中申请权限并获取IMEI
private async void GetImeiButton_Clicked(object sender, EventArgs e)
{
    var status = await Permissions.CheckStatusAsync<Permissions.Phone>();
    if (status != PermissionStatus.Granted)
    {
        status = await Permissions.RequestAsync<Permissions.Phone>();
    }

    if (status == PermissionStatus.Granted)
    {
        var imei = DependencyService.Get<IDevice>().GetImei();
        // 处理获取到的IMEI
    }
}

内容的提问来源于stack exchange,提问作者F205

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:15:33