在android中使用电话管理器查找IMEI号码

Posted

技术标签:

【中文标题】在android中使用电话管理器查找IMEI号码【英文标题】:Using Telephony Manager in android to find IMEI number 【发布时间】:2011-11-22 18:30:39 【问题描述】:

我对 android 开发非常陌生。 我想查找手机的 IMEI 号码并使用“android.telephony.TelephonyManager;”。

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getDeviceId();

现在编译器说。 上下文无法解析为变量。 任何人都可以帮助我吗?我错过了什么步骤 我还在 XML 中包含了用户权限。

【问题讨论】:

【参考方案1】:

试试下面的代码,它将帮助您获取设备的 IMEI 号码。

public String getDeviceID()  
    String deviceId;   
    TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (mTelephony.getDeviceId() != null) 
            deviceId = mTelephony.getDeviceId(); 
         else 
            deviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
        
    return deviceId;

还要在清单中授予读取手机状态的权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

【讨论】:

【参考方案2】:

[如果有人仍然在这里跌跌撞撞地寻找这个仍然存在的古老解决方案]

AFAIK,由于运营商的各种限制,TelephonyManager.getLine1Number() 不可靠。 有一些基于 Java 反射的 hack,但因设备而异,因此这些 hack 毫无用处[至少在支持的模型方面]

但是如果你真的需要的话,有一个合法的逻辑可以找到这个数字。通过短信服务商查询所有短信,获取“收件人”号码。

此技巧的额外好处:1.如果设备中有multi sim,您可以获得所有行号。

缺点:1. 您需要 SMS_READ 权限 [对此感到抱歉] 2.您将获得设备中使用过的所有SIM卡号码。这个问题可以通过一些约束逻辑来最小化,例如时间范围(仅在今天收到或发送的短信)等。听听其他人关于如何改进此案例会很有趣。

【讨论】:

【参考方案3】:

加入这段代码:

 TelephonyManager manager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 String deviceid=manager.getDeviceId();

//Device Id is IMEI number

  Log.d("msg", "Device id"+deviceid);

清单

   <uses-permission android:name="android.permission.READ_PHONE_STATE" />

【讨论】:

【参考方案4】:

验证您的导入,您应该导入:android.content.Context

然后使用这段代码:

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// get IMEI
String imei = tm.getDeviceId();
//get The Phone Number
String phone = tm.getLine1Number();

或者直接:使用这个:

TelephonyManager tm = (TelephonyManager) getSystemService(android.content.Context.TELEPHONY_SERVICE);

编辑: *您应该将上下文传递给构造函数上的新类:*

public class YourClass 
    private Context context;

    //the constructor 
    public YourClass( Context _context)

        this.context = _context;
        //other initialisations .....

    

   //here is your method to get the IMEI Number by using the Context that you passed to your class
   public String getIMEINumber()
       //...... place your code here 
   


在您的 Activity 中,实例化您的类并将上下文传递给它,如下所示:

YourClass instance = new YourClass(this);
String IMEI = instance.getIMEINumber();

【讨论】:

现在还可以,但下次先仔细阅读问题,然后以适当的方式给出答案 我已经仔细阅读了这个问题,在它被编辑之前我已经阅读了它,问题是:获取 IMEI 号码,这不是更详细的 :) 他被问到示例代码的问题,现在有问题,但格式不好,所以我只是添加了他的问题..但他用示例代码问了问题..还有一件事兄弟我不想和你吵架,我只是建议你别无所求.. 大声笑,我也是,我不和你打架,来吧!我也只是告诉你,我已经仔细阅读了这个问题,感谢你的建议:) 谢谢大家,我没有导入android.content.Context。【参考方案5】:

只需删除 Context.TELEPHONY_SERVICE 中的 Context 关键字并检查

TelephonyManager tManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

String IMEI = tManager.getDeviceId();

【讨论】:

【参考方案6】:

对于编译器错误“无法将上下文解析为变量”,请确保您已导入 android.content.Context 包。 在 Eclipse 中,当您将鼠标指针移到代码中的错误行上时,会进行快速修复。并确保您已添加 READ_PHONE_STATE 权限清单文件。

【讨论】:

以上是关于在android中使用电话管理器查找IMEI号码的主要内容,如果未能解决你的问题,请参考以下文章

如何处理2电话权限以获取设备的IMEI号码和手机号码?

我在 Android Q 中将 IMEI 设为空?

我在 Android Q 中获得了 IMEI 空值?

如何通过代码编程获取设备的 IMEI/ESN 号码但在 android > 6

在所有 android 设备中获取多个 imei 号码

如何在 Contacts Android 中查找所有电话号码并为其添加前缀?