tm.getDeviceId()被弃用了?

22

我正在获取IMEI和设备ID,但遇到了问题:getDeviceId()已被弃用。

TelephonyManager tm = (TelephonyManager) 
                 getSystemService(this.TELEPHONY_SERVICE);

imei = tm.getDeviceId();
device = Settings.Secure.getString(this.getContentResolver(),
           Settings.Secure.ANDROID_ID);

请阅读在什么情况下我可以在我的问题中添加“紧急”或其他类似短语,以便获得更快的答案? - 总结是这不是一个理想的方式来处理志愿者,并且可能会适得其反,导致无法获得答案。请不要在您的问题中添加此内容。 - halfer
6个回答

24

getDeviceId()

返回订阅的唯一设备ID,例如GSM手机的IMEI和CDMA手机的MEID。如果设备ID不可用,则返回null。

此方法已在API级别26中弃用。

使用(@link getImei}来获取GSMIMEI

或者使用(@link getMeid}来获取CDMAMEID

更多信息请参见TelephonyManager

尝试使用此代码获取IMEI

 @RequiresApi(api = Build.VERSION_CODES.O)
 TelephonyManager tm = (TelephonyManager)
            getSystemService(this.TELEPHONY_SERVICE);
    String imei = tm.getImei();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String imei = telephonyMgr.getImei();
} else {
            String imei = telephonyMgr.getDeviceId();
}

尝试以下方法获取MEID

@RequiresApi(api = Build.VERSION_CODES.O)
TelephonyManager tm = (TelephonyManager)
            getSystemService(this.TELEPHONY_SERVICE);
           
    String meid=tm.getMeid();

或者

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String meid=tm.getMeid();
} 

我该如何在我的活动中使用 (@link getImei} - ravi
模拟器返回 null。这正常吗? - Yaroslav Dukal

8
这是我的解决方案:
@SuppressWarnings("deprecation")
private String getIMEINumber() {
    String IMEINumber = "";
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
        TelephonyManager telephonyMgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            IMEINumber = telephonyMgr.getImei();
        } else {
            IMEINumber = telephonyMgr.getDeviceId();
        }
    }
    return IMEINumber;
}

7

编辑:自Android 10起,如果没有READ_PRIVILEGED_PHONE_STATE权限,则无法请求IMEI和MEID。

难道不应该像这样吗?

            if (Build.VERSION.SDK_INT >= 26) {
                if (telMgr.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
                    deviceId = telMgr.getMeid();
                } else if (telMgr.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
                    deviceId = telMgr.getImei();
                } else {
                    deviceId = ""; // default!!!
                }
            } else {
                deviceId = telMgr.getDeviceId();
            }

2
第三方应用程序无法请求“READ_PRIVILEGED_PHONE_STATE”。 - Farid

4

复制并粘贴我的程序并理解它。我们在这里面临的唯一问题是权限(运行时和检查权限类型); - 现在我已经完成了它,并在此处粘贴了一个准确的程序:

import android.*;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.UUID;

public class Login extends AppCompatActivity {

    private Button loginBtn;
    private TextView textView;
    private String IMEINumber;




    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        loginBtn = (Button) findViewById(R.id.loginBtn);
        textView = (TextView) findViewById(R.id.textView);
        final int reqcode = 1;


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            String[] per = {Manifest.permission.READ_PHONE_STATE};
            requestPermissions(per, reqcode);
            loginBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                    if (ActivityCompat.checkSelfPermission(Login.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                            IMEINumber = tm.getImei();
                            textView.setText(IMEINumber);
                        }
                    } else {
                        IMEINumber = tm.getDeviceId();
                        textView.setText(IMEINumber);
                    }
                }
            });


        }
    }

}

2
一般情况下,如果答案能够包含代码意图和为什么这样做可以解决问题且不会引入其他问题的解释,那么它们就更有帮助。感谢您提高了答案的参考价值并使其更易于理解! - Tim Diekmann

4

以下是获取设备ID(IMEI)的Kotlin代码,包括权限处理和兼容性检查,适用于所有Android版本:

 val  telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        == PackageManager.PERMISSION_GRANTED) {
        // Permission is  granted
        val imei : String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             telephonyManager.imei
         } else { // older OS  versions
             telephonyManager.getDeviceId()
         }

        imei?.let {
            Log.i("Log", "DeviceId=$imei" )
        }

    } else {  // Permission is not granted

    }

同时在 AndroidManifest.xml 中添加此权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- IMEI-->

0

自 Android 10 开始,您不应该请求 IMEI
https://developer.android.com/training/articles/user-data-ids#java

解决方法:

TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (null != telephonyManager) {
    if (telephonyManager.getDeviceId() != null){
        deviceUniqueIdentifier = telephonyManager.getDeviceId();
    }else{
        //Workarroud here
        deviceUniqueIdentifier = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接