Frage

Zur Identifizierung der einzelnen Geräte eindeutig, ich würde wie zu verwenden die IMEI (oder ESN-Nummer für CDMA-Geräte).Wie Zugriff auf diese programmgesteuert?

War es hilfreich?

Lösung

Sie möchten android.telephony.TelephonyManager.getDeviceId() .

Dies kehrt was Zeichenfolge eindeutig identifiziert, das Gerät (IMEI auf GSM, MEID für CDMA).

Sie werden die folgende Berechtigung in Ihrem AndroidManifest.xml müssen:

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

, um dies zu tun.

Das wird gesagt, vorsichtig sein, dies zu tun. Nicht nur werden die Nutzer fragen sich, warum Ihre Anwendung ihre Telefonie-Stack zugreift, könnte es zu migrieren Daten über schwierig sein, wenn der Benutzer erhält ein neues Gerät.

Update: Wie bereits erwähnt in den Kommentaren unten, ist dies nicht eine sichere Art und Weise zu authentifizieren Benutzer und wirft Bedenken hinsichtlich der Privatsphäre. Es wird nicht empfohlen. Stattdessen sehen Sie die Google+ Anmeldung API , wenn Sie einen reibungs implementieren Login-System.

Android Backup-API ist auch verfügbar, wenn Sie nur wollen leicht und ideal für ein Bündel von Zeichenkette bestehen, wenn ein Benutzer setzt ihr Handy (oder kauft ein neues Gerät).

Andere Tipps

Neben der Antwort von Trevor Johns, können Sie diese wie folgt verwenden:

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

Und Sie sollten die folgende Berechtigung in Ihre Manifest.xml-Datei hinzu:

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

In Emulator, werden Sie wahrscheinlich ein wie ein "00000 ..." Wert. GetDeviceID () gibt NULL, wenn Geräte-ID nicht verfügbar ist.

Ich verwende den folgenden Code, um die IMEI oder verwendet Secure.ANDROID_ID als Alternative zu bekommen, wenn das Gerät nicht auf Telefonfunktionen hat:

/**
 * Returns the unique identifier for the device
 *
 * @return unique identifier for the device
 */
public String getDeviceIMEI() {
    String deviceUniqueIdentifier = null;
    TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    if (null != tm) {
        deviceUniqueIdentifier = tm.getDeviceId();
    }
    if (null == deviceUniqueIdentifier || 0 == deviceUniqueIdentifier.length()) {
        deviceUniqueIdentifier = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
    }
    return deviceUniqueIdentifier;
}

Oder Sie die ANDROID_ID Einstellung von Android.Provider.Settings.System verwenden können (wie hier beschrieben strazerre. com ).

Dies hat den Vorteil, dass es erfordert keine speziellen Berechtigungen können aber ändern, wenn eine andere Anwendung Schreibzugriff hat und ändert es (was anscheinend ungewöhnlich ist, aber nicht unmöglich).

Gerade als Referenz hier ist der Code aus dem Blog:

import android.provider.Settings;
import android.provider.Settings.System;   

String androidID = System.getString(this.getContentResolver(),Secure.ANDROID_ID);

Die Umsetzung beachten : , wenn die ID an die Systemarchitektur kritisch ist, müssen Sie sich bewusst sein, dass in der Praxis einige der sehr niedrigen End-Android-Handys und Tabletten gefunden haben, die gleiche ANDROID_ID Wiederverwendung (9774d56d682e549c war der Wert in unseren Protokollen zeigt nach oben)

Von: http : //mytechead.wordpress.com/2011/08/28/how-to-get-imei-number-of-android-device/ :

Der folgende Code hilft bei der Beschaffung von IMEI-Nummer von Android-Geräten:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String device_id = tm.getDeviceId();

Berechtigungen erforderlich in Android Manifest:

android.permission.READ_PHONE_STATE

Hinweis: Im Fall von Tabletten oder Geräten, die nicht als Handy handeln können IMEI wird null sein.

zu erhalten IMEI (international mobile equipment identifier)

public String getIMEI(Activity activity) {
    TelephonyManager telephonyManager = (TelephonyManager) activity
            .getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
}

zu erhalten Gerät einzigartige id

public String getDeviceUniqueID(Activity activity){
    String device_unique_id = Secure.getString(activity.getContentResolver(),
            Secure.ANDROID_ID);
    return device_unique_id;
}

Für Android 6.0+ hat das Spiel verändert, so schlage ich vor, Sie verwenden diese;

Der beste Weg zu gehen, ist während der Laufzeit sonst erhalten Sie die Erlaubnis Fehler.

   /**
 * A loading screen after AppIntroActivity.
 */
public class LoadingActivity extends BaseActivity {
private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 0;
private TextView loading_tv2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_loading);

    //trigger 'loadIMEI'
    loadIMEI();
    /** Fading Transition Effect */
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}

/**
 * Called when the 'loadIMEI' function is triggered.
 */
public void loadIMEI() {
    // Check if the READ_PHONE_STATE permission is already available.
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED) {
        // READ_PHONE_STATE permission has not been granted.
        requestReadPhoneStatePermission();
    } else {
        // READ_PHONE_STATE permission is already been granted.
        doPermissionGrantedStuffs();
    }
}



/**
 * Requests the READ_PHONE_STATE permission.
 * If the permission has been denied previously, a dialog will prompt the user to grant the
 * permission, otherwise it is requested directly.
 */
private void requestReadPhoneStatePermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.READ_PHONE_STATE)) {
        // Provide an additional rationale to the user if the permission was not granted
        // and the user would benefit from additional context for the use of the permission.
        // For example if the user has previously denied the permission.
        new AlertDialog.Builder(LoadingActivity.this)
                .setTitle("Permission Request")
                .setMessage(getString(R.string.permission_read_phone_state_rationale))
                .setCancelable(false)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        //re-request
                        ActivityCompat.requestPermissions(LoadingActivity.this,
                                new String[]{Manifest.permission.READ_PHONE_STATE},
                                MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
                    }
                })
                .setIcon(R.drawable.onlinlinew_warning_sign)
                .show();
    } else {
        // READ_PHONE_STATE permission has not been granted yet. Request it directly.
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
                MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
    }
}

/**
 * Callback received when a permissions request has been completed.
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {

    if (requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_STATE) {
        // Received permission result for READ_PHONE_STATE permission.est.");
        // Check if the only required permission has been granted
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // READ_PHONE_STATE permission has been granted, proceed with displaying IMEI Number
            //alertAlert(getString(R.string.permision_available_read_phone_state));
            doPermissionGrantedStuffs();
        } else {
            alertAlert(getString(R.string.permissions_not_granted_read_phone_state));
          }
    }
}

private void alertAlert(String msg) {
    new AlertDialog.Builder(LoadingActivity.this)
            .setTitle("Permission Request")
            .setMessage(msg)
            .setCancelable(false)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // do somthing here
                }
            })
            .setIcon(R.drawable.onlinlinew_warning_sign)
            .show();
}


public void doPermissionGrantedStuffs() {
    //Have an  object of TelephonyManager
    TelephonyManager tm =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    //Get IMEI Number of Phone  //////////////// for this example i only need the IMEI
    String IMEINumber=tm.getDeviceId();

    /************************************************
     * **********************************************
     * This is just an icing on the cake
     * the following are other children of TELEPHONY_SERVICE
     *
     //Get Subscriber ID
     String subscriberID=tm.getDeviceId();

     //Get SIM Serial Number
     String SIMSerialNumber=tm.getSimSerialNumber();

     //Get Network Country ISO Code
     String networkCountryISO=tm.getNetworkCountryIso();

     //Get SIM Country ISO Code
     String SIMCountryISO=tm.getSimCountryIso();

     //Get the device software version
     String softwareVersion=tm.getDeviceSoftwareVersion()

     //Get the Voice mail number
     String voiceMailNumber=tm.getVoiceMailNumber();


     //Get the Phone Type CDMA/GSM/NONE
     int phoneType=tm.getPhoneType();

     switch (phoneType)
     {
     case (TelephonyManager.PHONE_TYPE_CDMA):
     // your code
     break;
     case (TelephonyManager.PHONE_TYPE_GSM)
     // your code
     break;
     case (TelephonyManager.PHONE_TYPE_NONE):
     // your code
     break;
     }

     //Find whether the Phone is in Roaming, returns true if in roaming
     boolean isRoaming=tm.isNetworkRoaming();
     if(isRoaming)
     phoneDetails+="\nIs In Roaming : "+"YES";
     else
     phoneDetails+="\nIs In Roaming : "+"NO";


     //Get the SIM state
     int SIMState=tm.getSimState();
     switch(SIMState)
     {
     case TelephonyManager.SIM_STATE_ABSENT :
     // your code
     break;
     case TelephonyManager.SIM_STATE_NETWORK_LOCKED :
     // your code
     break;
     case TelephonyManager.SIM_STATE_PIN_REQUIRED :
     // your code
     break;
     case TelephonyManager.SIM_STATE_PUK_REQUIRED :
     // your code
     break;
     case TelephonyManager.SIM_STATE_READY :
     // your code
     break;
     case TelephonyManager.SIM_STATE_UNKNOWN :
     // your code
     break;

     }
     */
    // Now read the desired content to a textview.
    loading_tv2 = (TextView) findViewById(R.id.loading_tv2);
    loading_tv2.setText(IMEINumber);
}
}

Hope dies hilft Ihnen oder jemand.

Neues Update:

Für Android Version 6 und höher, WLAN-MAC-Adresse veraltet ist, folgen Trevor Johns Antwort

Update:

Für eindeutige Identifizierung von Geräten, können Sie sichern. ANDROID_ID .

Alte Antwort:

Die Nachteile der Verwendung von IMEI als eigene Geräte-ID:

  • IMEI ist abhängig von der Simkarte Schlitz des Gerätes, so dass es nicht ist möglich, die IMEI für die Geräte zu erhalten, die Simkarte nicht verwenden.    In Dual-SIM-Geräte erhalten wir 2 verschiedene IMEI für das gleiche Gerät, wie es 2 Steckplätze für Simkarte hat.

Sie können Verwendung Die WLAN-MAC-Adresse Zeichenfolge (nicht für Eibisch Eibisch + Empfohlen als WLAN-MAC-Adresse ist auf Eibisch vorwärts veraltet. So werden Sie einen falschen Wert erhalten)

Wir können die eindeutige ID erhalten für Android-Handys auch die WLAN-MAC-Adresse. Die MAC-Adresse ist einzigartig für alle Geräte und es funktioniert für alle Arten von Geräten.

Die Vorteile der Verwendung von WLAN-MAC-Adresse als Geräte-ID:

  • Es ist eindeutige Kennung für alle Arten von Geräten (Smartphones und    Tabletten).

  • Es bleibt einzigartig, wenn die Anwendung neu installiert wird

Nachteile der Verwendung von WLAN-MAC-Adresse als Geräte-ID:

  • Geben Sie einen Bogus Wert von Eibisch und höher.

  • Wenn das Gerät nicht Wi-Fi-Hardware hat dann erhalten Sie null MAC-Adresse,    aber im Allgemeinen ist zu sehen, dass die meisten der Android-Geräte haben Wi-Fi    Hardware, und es gibt kaum wenige Geräte auf dem Markt ohne Wi-Fi    Hardware.

QUELLE: technetexperts .com

Wie in API 26 GetDeviceID () abgeschrieben wird, so dass Sie 26 folgenden Code gerecht zu werden API verwenden können und früheren Versionen

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String imei="";
if (android.os.Build.VERSION.SDK_INT >= 26) {
  imei=telephonyManager.getImei();
}
else
{
  imei=telephonyManager.getDeviceId();
}

Vergessen Sie nicht Erlaubnis-Anfrage für „READ_PHONE_STATE“ zu verwenden obigen Code hinzuzufügen.

Die Methode GetDeviceID () von TelephonyManager gibt die eindeutige Geräte-ID, beispielsweise die IMEI für GSM und der MEID oder ESN für CDMA-Telefone. Zurück null, wenn Geräte-ID nicht verfügbar ist.

Java-Code

package com.AndroidTelephonyManager;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;

public class AndroidTelephonyManager extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TextView textDeviceID = (TextView)findViewById(R.id.deviceid);

    //retrieve a reference to an instance of TelephonyManager
    TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

    textDeviceID.setText(getDeviceID(telephonyManager));

}

String getDeviceID(TelephonyManager phonyManager){

 String id = phonyManager.getDeviceId();
 if (id == null){
  id = "not available";
 }

 int phoneType = phonyManager.getPhoneType();
 switch(phoneType){
 case TelephonyManager.PHONE_TYPE_NONE:
  return "NONE: " + id;

 case TelephonyManager.PHONE_TYPE_GSM:
  return "GSM: IMEI=" + id;

 case TelephonyManager.PHONE_TYPE_CDMA:
  return "CDMA: MEID/ESN=" + id;

 /*
  *  for API Level 11 or above
  *  case TelephonyManager.PHONE_TYPE_SIP:
  *   return "SIP";
  */

 default:
  return "UNKNOWN: ID=" + id;
 }

}
}

XML

<linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
<textview android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/hello">
<textview android:id="@+id/deviceid" android:layout_height="wrap_content" android:layout_width="fill_parent">
</textview></textview></linearlayout> 

Permission Required READ_PHONE_STATE in Manifest-Datei.

Sie können diese TelephonyManager verwenden TELEPHONY_SERVICE Funktion erhalten eindeutige Geräte-ID , Benötigt Berechtigung: READ_PHONE_STATE

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

Beispiel, die IMEI für GSM und MEID oder ESN für CDMA Telefone.

/**
 * Gets the device unique id called IMEI. Sometimes, this returns 00000000000000000 for the
 * rooted devices.
 **/
public static String getDeviceImei(Context ctx) {
    TelephonyManager telephonyManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
}

Zurück null , wenn Geräte-ID nicht verfügbar ist .

Die Methode getDeviceId() ist veraltet. Es gibt eine neue Methode für diese getImei(int)

hier prüfen

Verwenden Sie den folgenden Code gibt Ihnen IMEI-Nummer:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("IMEI::" + telephonyManager.getDeviceId());

Versuchen Sie, diese (Notwendigkeit, immer zuerst IMEI zu bekommen)

TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(LoginActivity.this,Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED) {

         return;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (mTelephony.getPhoneCount() == 2) {
                    IME = mTelephony.getImei(0);
                }else{
                    IME = mTelephony.getImei();
                }
            }else{
                if (mTelephony.getPhoneCount() == 2) {
                    IME = mTelephony.getDeviceId(0);
                } else {
                    IME = mTelephony.getDeviceId();
                }
            }
        } else {
            IME = mTelephony.getDeviceId();
        }

für die API-Stufe 11 oder höher:

case TelephonyManager.PHONE_TYPE_SIP: 
return "SIP";

TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(tm));

Kotlin-Code für das Erhalten DeviceId (IMEI) mit dem Umgang mit Erlaubnis & Vergleichbarkeitsprüfung für alle Android-Versionen:

 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
        // older OS  versions
        else  telephonyManager.deviceId

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

    } else {  // Permission is not granted

    }

Fügen Sie auch diese Berechtigung AndroidManifest.xml:

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

Für die Suche nach einer Kotlin Version suchen, sind Sie so etwas wie diese verwenden können;

private fun telephonyService() {
    val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
    val imei = if (android.os.Build.VERSION.SDK_INT >= 26) {
        Timber.i("Phone >= 26 IMEI")
        telephonyManager.imei
    } else {
        Timber.i("Phone IMEI < 26")
        telephonyManager.deviceId
    }

    Timber.i("Phone IMEI $imei")
}

Hinweis: Sie müssen telephonyService() wickeln oben mit einer Berechtigungsprüfung mit checkSelfPermission oder was auch immer Methode, die Sie verwenden.

Fügen Sie auch diese Berechtigung in der Manifest-Datei;

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top