Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android】固有デバイスID(IMEI番号)を取得する方法を徹底解説

はじめに

AndroidアプリからIMEI番号などの固有デバイスIDをプログラム的に取得したい場合は、TelephonyManagerを利用します。本記事では、実際に動作するサンプルプロジェクトを作りながら、その手順をわかりやすく解説していきます。

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、「File」→「New Project」を選択して、必要事項を入力しながら新しいプロジェクトを作成しましょう。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android = "https://schemas.android.com/apk/res/android"
   xmlns:app = "https://schemas.android.com/apk/res-auto"
   xmlns:tools = "https://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:layout_height = "match_parent"
   tools:context = ".MainActivity">
   <Button
   android:id = "@+id/button"
   android:layout_width = "wrap_content"
   android:layout_height = "wrap_content"
   android:text = "Click here to hide"
   app:layout_constraintBottom_toBottomOf = "parent"
   app:layout_constraintLeft_toLeftOf = "parent"
   app:layout_constraintRight_toRightOf = "parent"
   app:layout_constraintTop_toTopOf = "parent" />
</android.support.constraint.ConstraintLayout>

ここでは、画面中央に配置されたボタンを1つ定義しています。このボタンをタップするとデバイスIDの取得処理が呼び出される仕組みです。

ステップ3:MainActivity.javaを実装する

src/MainActivity.java に以下のコードを追加します。

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
   TelephonyManager telephonyManager;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Button button = findViewById(R.id.button);
      button.setOnClickListener(this);
   }
   @RequiresApi(api = Build.VERSION_CODES.O)
   @Override
   public void onClick(View v) {
      switch (v.getId()) {
         case R.id.button:
         deviceId();
         break;
      }
   }
   private void deviceId() {
      telephonyManager = (TelephonyManager) getSystemService(this.TELEPHONY_SERVICE);
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
         ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 101);
         return;
      }
   }
   @Override
   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
      switch (requestCode) {
         case 101:
         if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
               ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 101);
               return;
            }
            String imeiNumber = telephonyManager.getDeviceId();
            Toast.makeText(MainActivity.this,imeiNumber,Toast.LENGTH_LONG).show();
         } else {
            Toast.makeText(MainActivity.this,"Without permission we check",Toast.LENGTH_LONG).show();
         }
         break;
         default:
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      }
   }
}

上記のコードでは、電話の状態(Phone State)を読み取るための実行時パーミッションを要求しています。この権限が許可されていないと、デバイスIDを取得することはできません。デバイスIDを取得する核となる部分は、以下の3行です。

TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService(this.TELEPHONY_SERVICE);
String imeiNumber = telephonyManager.getDeviceId();

ステップ4:AndroidManifest.xmlにパーミッションを宣言する

AndroidManifest.xml に以下のコードを追加します。

<manifest xmlns:android = "https://schemas.android.com/apk/res/android"
package = "com.example.andy.myapplication">
   <uses-permission android:name = "android.permission.READ_PHONE_STATE" />
   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:roundIcon = "@mipmap/ic_launcher_round"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
      <activity android:name = ".MainActivity">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />
            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

このマニフェストでは、READ_PHONE_STATEパーミッションを宣言しています。これにより、端末の電話状態に関する情報へアクセスできるようになります。

アプリの実行と動作確認

それではアプリを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続しておいてください。Android Studioで任意のアクティビティファイルを開き、ツールバーの「Run」アイコン 【Android】固有デバイスID(IMEI番号)を取得する方法を徹底解説 をクリックします。接続中のモバイルデバイスを選択すると、端末側にアプリの初期画面が表示されます。

【Android】固有デバイスID(IMEI番号)を取得する方法を徹底解説

ボタンをタップすると、ユーザーに対して実行時パーミッションを求めるダイアログが表示されます。ユーザーが許可することで、IMEI番号を取得できるようになります。

【Android】固有デバイスID(IMEI番号)を取得する方法を徹底解説

以上の手順で、IMEI番号(固有識別番号)の取得に成功しました。(セキュリティ保護のため、ここでは実際の番号を非表示にしています。)

【Android】固有デバイスID(IMEI番号)を取得する方法を徹底解説

一方、ユーザーが実行時パーミッションを拒否した場合は、上記画像のように拒否を伝えるメッセージが表示されます。

補足:新しいAndroidバージョンでの注意点

getDeviceId()はAPIレベル26(Android 8.0)以降で非推奨となっており、代わりにgetImei()の使用が推奨されています。Android 8.0以降をサポートする場合は、Build.VERSION.SDK_INTによるバージョン分岐を組み込むと安全です。また、近年のGoogle Playポリシーでは、IMEIのような永続的な端末識別子へのアクセスが厳しく制限されているため、一般公開するアプリではANDROID_IDや広告IDなど、代替となる識別方法の検討もあわせておすすめします。

  1. Androidの設定メニューを開く方法|覚えておきたいアクセス手段と便利な設定項目まとめ

    新しいAndroidスマートフォンを購入した直後は、操作に慣れるまでに多少の時間がかかるものです。Android OSは長年の間に大きく進化しており、Android MarshmallowからAndroid PieやAndroid 10のような大幅なバージョンアップを行うと、最初は戸惑うこともあるでしょう。ナビゲーションの操作方法、アイコンのデザイン、アプリドロワー、ウィジェット、設定項目など、変化に気づくポイントは数多くあります。混乱して助けを求めたくなるのはごく自然なことであり、まさにこの記事はそのために存在します。新しいスマートフォンに早く慣れるための最善の方法は、設定メニューを一通り確

  2. パソコンなしでAndroidをroot化する方法|使えるアプリ6選と手順を徹底解説

    Android端末のroot化は、初心者にとってはハードルが高く感じられる作業です。リスクが伴うため、root化に踏み切れない人も少なくありません。まず知っておくべきなのは、root化を行うとメーカー保証が無効になるという点です。さらに、作業中に失敗すればスマートフォンが二度と起動しなくなる(文鎮化)可能性もあります。しかし、Androidにある程度精通していて技術的な経験があるなら、root化はそれほど難しい作業ではありません。信頼できるガイドを見つけて、手順を慎重かつ正確に実行すればよいだけです。一般的には「root化にはパソコンとADBなどの専用ソフトが必要」と思われがちですが、実はパソ